OCR图像预处理

4
我一直使用office文档成像进行OCR,以从图像中获取文本。对于这个图像:
我想知道在将其提供给OCR之前,用于改善图像质量的预处理步骤。到目前为止,我尝试了二值化(阈值),模糊(高斯),锐化,均值去除和增加图像的亮度和对比度等方法,但OCR引擎仍无法获得准确的文本(可能只有50%的成功率)。
我想知道正确顺序的预处理步骤(最好是C#),以改善图像质量。屏幕的图像是通过网络摄像头捕获的。谢谢。
2个回答

1
我用我的DIP库在C++中对您的图像进行了一些处理,这是结果:
picture pic0,pic1;
pic0.load("ocr_green.png");
pic0.pixel_format(_pf_u);       // RGB -> Grayscale <0-765>
pic0.enhance_range();           // remove DC offset and use full dynamic range <0-765>
pic0.normalize(8,false);        // try to normalize ilumination conditions of image (equalize light) based on 8x8 sqares analysis, do not recolor saturated square with avg color
pic0.enhance_range();           // remove DC offset and use full dynamic range <0-765>
pic1=pic0;                      // copy result to pic1
pic0.pixel_format(_pf_rgba);    // Grayscale -> RGBA
int x,y,c,c0,c1;
for (y=0;y<pic1.ys;y++)         // process all H lines
    {
    c0=pic1.p[y][0].dd; c1=c0;  // find min and max intensity in H line
    for (x=0;x<pic1.xs;x++)
        {
        c=pic1.p[y][x].dd;
        if (c0>c) c0=c;
        if (c1<c) c1=c;
        }
    if (c1-c0<700)              // if difference not big enough blacken H line...
     for (x=0;x<pic1.xs;x++) pic1.p[y][x].dd=0;
    else                        // else binarize H line
     for (x=0;x<pic1.xs;x++)
      if (pic1.p[y][x].dd>=155) pic1.p[y][x].dd=765; else pic1.p[y][x].dd=0;
    }
pic1.pixel_format(_pf_rgba);    // Grayscale -> RGBA

example

左侧的图像(pic0)只是将您的图像转换为灰度,增强了动态范围并均衡了光照。

右侧的图像(pic1)仅对具有足够高的像素强度变化的水平线进行二值化处理(如我在评论中提到的)...其余部分设置为黑色...


@问题:您使用的是哪种像素格式?如果您使用的是RGB 24/32位,那么每个字节就是R,G,B=<0,255>...当我使用灰度时,我只需将R,G,B相加即可得到I=R+G+B=<0,3*255=765>,以简化事情...如果您想回到RGB,则只需R=G=B=I/3;这正是我的pixel_format所做的,我的每个像素都是{ DWORD dd; DWORD dw[2]; BYTE db[4]; }的联合体,因此我可以轻松地访问像素作为32位、2x16位或4x8位值,这对应于完整的颜色、导数和r、g、b、a分量。 - Spektre
@Spektre,还是没有成功。我目前正在使用灰度图像并直接应用您的代码,而不使用您使用的其他函数。 - Questions
让我们在聊天中继续这个讨论 - Questions
很抱歉更新有所延迟。自动调整对比度可以提高OCR的质量和输出效果。但是,由于这些图像是摄像头拍摄的,并且在不同的光线下拍摄,因此其效果并不相同。我不确定是否有一种通用的实现方法可以使其适用于所有图像。我仍在努力尝试。 - Questions
@Spektre,我想知道如何实现增强范围和归一化?有什么指导可以提供吗?谢谢。 - Questions
显示剩余6条评论

1
这张图片非常适合OCR,质量很好,能够无缝二值化。根据引擎的不同,您可以自己执行二值化或让引擎执行。
可能需要将底部区域涂黑以便分离字符。由于屏幕布局是固定的,这可以很容易地自动化。
您还需要检查此OCR是否了解此字体。

enter image description here

你可以通过轮廓分析(横向累加)来确定白色区域的范围。

enter image description here


通过OCR,您的图像可以几乎完美地获取文本,只是无法识别字体的某些字符。我能够将其二值化,但由于文本可能动态出现在多行中,我不确定如何使底部区域变黑。有没有办法在这种情况下自动化处理? - Questions
1
@问题:我首先会检测水平线是否有任何黑色像素,如果有,那么才将其二值化,否则将其设置为黑色...所以你要记住最暗和最亮的颜色,如果它们的强度差足够大... - Spektre
1
@问题:白色区域沿水平方向累加像素值并进行轮廓分析,定位并不是很困难。(请参见新图片。) - user1196549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接