2011-11-17 36 views
1

我對Leptonica有一個有趣的問題,我想知道其他SO成員是否看過。修復Leptonica中的本地扭曲1.68

我正在做一個歪斜操作,並有嚴重的僞像問題,以至於沒有人會正確地接受結果,這會降低圖像質量而不是降低圖像質量。

下面是產生偏斜校正操作的相關代碼:

// Make a black and white version for deskew calculations 
    l_int32 thresh; 
    PIX * deskewbw = pixMaskedThreshOnBackgroundNorm(pix,NULL,10,15,25,10,2,2,0.1,&thresh); 
    NSLog(@"Used threshold of %d to normalize image for deskew",thresh); 

    // Find the local skew 
    PTA * ptas, *ptad; 
    pixGetLocalSkewTransform(deskewbw, 0, 0, 0, 0.0, 0.0, 0.0, &ptas, &ptad); 

    // Cleanup the first B/W version 
    pixDestroy(&deskewbw); 

    // Deskew the original image 
    PIX * deskewgray = pixProjectivePtaGray(pix, ptad, ptas, 128); 

    // Reduce the deskewed original image to B/W 
    pixbw = pixMaskedThreshOnBackgroundNorm(deskewgray, NULL, 10, 15, 25, 10, 2, 2, 0.1, &thresh); 

不管我用這個,或者pixDeskewLocal功能(它類似的東西),我得到一個隔行線影響一些很醜陋的結果:

Ugly deskew artifacts

只是爲了對比,原來這裏是(稍微傾斜)圖像:

Original Image

無論原始圖像是黑色還是白色的前景,並且在偏移更多的區域更嚴重,都會發生這種情況。在這一點上,我只是試圖讓iOS爲我做這個渲染,以避免Leptonica執行這個特定的操作,但是這增加了我工作流程中的轉換次數,如果可能,我寧願避免。

有沒有其他人遇到/克服過這個問題?關於爲什麼發生這種情況的任何指針/如何解決它?

回答

3

您可以使用函數pixEndianByteSwap(pixbw);來解決此問題。

+0

馬克,我希望你四個月前能幫助解決這個問題。謝謝。 – SplinterReality

0

我從圖像處理的角度思考了這一點,並意識到我可能在向Leptonica讀取數據時犯了一個錯誤,而不是Leptonica成爲這裏的罪魁禍首,事實證明,我是對的。

該故障的像素間距爲4,結果表明,Leptonica讀取數據中的單詞,從MSB/MSb處理到LSB/LSb,導致CGContext寫入數據的方式和Leptonica讀它。如果您將數據讀入Leptonica作爲rgba,這並不是一個大問題,因爲一旦您將其平滑到灰度或B/W,錯誤大多消失(以某些動態範圍爲代價),但由於我正在讀取數據在8位灰度中,錯誤並沒有消失,而是如您在上面看到的那樣表現出來。

在Big-Endian系統上,在Little-Endian系統上,數據需要分成單詞,字節順序顛倒以形成CGContext的合理圖像,不需要進行更改。我寧願找到一種讓CGContext爲我做這件事的方法,但現在,我會以艱難的方式解決這個問題。