我一直在使用OCR的office文档成像来获取图像中的文本。对于这张照片,

我想知道在将图像输入到OCR之前,需要进行哪些预处理来提高图像的质量。到目前为止,我已经尝试过二值化(阈值)、模糊(高斯)、锐化、平均去除&增加图像的亮度和对比度,但是OCR引擎仍然无法得到准确的文本(可能是50 %的成功)。
我想知道的预处理步骤(按正确的顺序),以提高质量,最好是在C#。屏幕的图像是通过网络摄像头拍摄的。谢谢。
发布于 2015-12-06 10:03:01
我用我的C++和DIP库播放了您的图像,结果如下:
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

左图像(pic0)只是你的转换为灰度,增强的动态范围到最大和平均照明。
picture类的描述.正确的图像(pic1)被二值化,但仅针对像素强度变化足够大的水平线(如我的注释中提到的).剩下的都是黑色的..。
发布于 2015-12-05 21:06:42
这张图像对于OCR来说是一个很好的质量。它将无缝地进行二值化。取决于引擎,您将自己执行二进制化,或者让引擎执行它。
也许你必须把底部的区域变黑,这样字符才能分开。由于屏幕布局是固定的,这可以很容易地自动化。
您还需要检查OCR是否知道这种字体。

您可以通过配置文件分析(水平累积)来分隔白色区域。

https://stackoverflow.com/questions/34108545
复制相似问题