修复Leptonica中的本地扭曲1.68

问题描述:

我对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执行这个特定的操作,但是这增加了我工作流程中的转换次数,如果可能,我宁愿避免。

有没有其他人遇到/克服过这个问题?关于为什么发生这种情况的任何指针/如何解决它?

您可以使用函数pixEndianByteSwap(pixbw);来解决此问题。

+0

马克,我希望你四个月前能帮助解决这个问题。谢谢。 – SplinterReality

我从图像处理的角度思考了这一点,并意识到我可能在向Leptonica读取数据时犯了一个错误,而不是Leptonica成为这里的罪魁祸首,事实证明,我是对的。

该故障的像素间距为4,结果表明,Leptonica读取数据中的单词,从MSB/MSb处理到LSB/LSb,导致CGContext写入数据的方式和Leptonica读它。如果您将数据读入Leptonica作为rgba,这并不是一个大问题,因为一旦您将其平滑到灰度或B/W,错误大多消失(以某些动态范围为代价),但由于我正在读取数据在8位灰度中,错误并没有消失,而是如您在上面看到的那样表现出来。

在Big-Endian系统上,在Little-Endian系统上,数据需要分成单词,字节顺序颠倒以形成CGContext的合理图像,不需要进行更改。我宁愿找到一种让CGContext为我做这件事的方法,但现在,我会以艰难的方式解决这个问题。