OCR图像预处理

时间:2015-12-05 17:29:25

标签: c# c++ image-processing ocr

我一直在使用OCR的办公文档成像来从图像中获取文本。对于此图片,

我想知道在将图像输入OCR之前提高图像质量所涉及的预处理步骤。到目前为止,我已经尝试了二值化(阈值),模糊(高斯),锐化,平均去除&增加图像的亮度和对比度,但OCR引擎仍然无法获得确切的文本(可能会有50%的成功)。

我想知道预处理步骤(按照正确的顺序),以便在C#中提高质量。通过网络摄像头捕获屏幕图像。感谢。

2 个答案:

答案 0 :(得分:1)

此图像的OCR质量非常好。它将无缝二值化。根据引擎的不同,您将自行执行二值化或让引擎进行二值化。

可能你必须将底部区域变黑,以便字符分离。由于屏幕布局是固定的,因此可以轻松实现自动化。

您还需要检查此OCR是否知道此字体。

enter image description here

您可以通过轮廓分析(水平累积)来划分白色区域。

enter image description here

答案 1 :(得分:1)

我使用 DIP lib在 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)是二值化的,但仅适用于像素强度变化足够大的水平线(如我的评论所述)......其余部分设置为黑色......