【问题标题】:PIL - Image processing - how to achieve a clean image with no noisy background?binarization step exagerated?PIL - 图像处理 - 如何获得没有嘈杂背景的干净图像?夸张的二值化步骤?
【发布时间】:2015-09-26 08:05:04
【问题描述】:

下午好,

我正在编写一个 ocr 程序来检测图像上的文本。到目前为止,我得到了很好的结果,但是当文本为黑色且背景为白色时。我可以做些什么来改善在浅色背景(黄色、绿色等)上有白色文字的图像?

一个原始示例图像可能是:

到目前为止,我只是使用以下方法将其转换为 gray_scale:

image = image.convert('L')

然后应用一系列过滤器,例如: 锐化 光滑的 模糊 等等

然后我像这样进行二值化:

image = image.point(lambda x: 0 if x<128 else 255, '1') #refers to http://stackoverflow.com/questions/18777873/convert-rgb-to-black-or-white and also to http://stackoverflow.com/questions/29923827/extract-cow-number-from-image

我的 outoup 图像对于像这样的 ocr 馈送确实非常糟糕:

我做错了什么?浅色背景上的白色文本的最佳方法应该是什么?

另一个疑问:我的二值化步骤是否过强/夸张?

我应该混合一些过滤器吗?你能推荐一些吗?

PS:我是图像处理的新手,所以请保持简单=x

非常感谢您的关注和帮助/建议。

【问题讨论】:

    标签: image-processing python-imaging-library ocr tesseract


    【解决方案1】:

    我用 ImageMagick 尝试过这个,它也有 Python 绑定——除了我是在命令行上做的。我想你可以很容易地适应我所做的事情——我不会说 Pythonese,也不会使用 PIL,但希望它能让你对可能的途径有所了解。

    convert http://i.stack.imgur.com/2cFk3.jpg -fuzz 50% -fill black +opaque white -threshold 50% x.png
    

    基本上,它会采用任何不在白色 50% 范围内的颜色并用黑色填充,然后将结果阈值化为纯黑色和白色。

    另一种选择是根据颜色的饱和度对图像进行阈值处理。因此,您转换为 HSB 颜色空间,分离通道并丢弃色调和亮度。然后,您将获得如下阈值的饱和度:

    convert http://i.stack.imgur.com/2cFk3.jpg -colorspace hsb -separate -delete 0,2 -threshold 50% x.png
    

    输入-negate 以获得黑底白字。

    我已经为 PIL 复制了一些其他代码,并且正在将其修改为可能接近您需要的内容 - 请记住,我不知道 Python:

    import colorsys
    from PIL import Image
    im = Image.open(filename)
    ld = im.load()
    width, height = im.size
    for y in range(height):
        for x in range(width):
            r,g,b = ld[x,y]
            h,s,v = colorsys.rgb_to_hsv(r/255., g/255., b/255.)
    
            if s>0.5:                     // <--- here onwards is my attempted Python
               ld[x,y] = (0,0,0)
            else:
               ld[x,y] = (255,255,255)
    

    【讨论】:

    • 好吧,现在我必须弄清楚如何用 pil 来做这件事,谢谢!
    • 谁能帮我把它“翻译”成pythonic语言? :)
    • Mark 所做的与您所做的唯一区别是灰度转换。将 rgb 变为灰色有多种方法,您的 50%(或 128)阈值适用于其中一种,但不适用于您使用的那种。这里真正的解决方案不是更改灰度转换或阈值以使其适用于您的黄底白图像,而是编写一个算法来搜索合适的阈值。一个示例是按颜色执行聚类,然后识别白色和黑色聚类并将除这些之外的所有聚类都涂黑。
    • 我仍然不知道任何 Python,但我相信您应该能够将图像转换为 numpy 数组(无论是什么),然后使用 matplotlib.org/api/colors_api.html#matplotlib.colors.rgb_to_hsv 转换为 HSV 之后,您会将饱和度值设为 50% 以获得我的第二个建议答案。
    • 感谢您的澄清@dvhamme。当您说“一个示例是按颜色执行聚类,然后识别白色和黑色聚类并将除那些之外的所有聚类都涂黑。”您的意思是自适应阈值?
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多