OpenCV 将所有文本处理为白底黑字(分段)

Posted

技术标签:

【中文标题】OpenCV 将所有文本处理为白底黑字(分段)【英文标题】:OpenCV process all text to be black on white (segmentation) 【发布时间】:2021-12-17 22:14:48 【问题描述】:

是否有可能以某种方式使文档中的所有文本在阈值处理后都是白底黑字。我一直在网上寻找,但我一直无法找到解决方案。我当前的阈值图像是:https://i.ibb.co/Rpqcp7v/thresh.jpg

文档需要由 OCR 读取,为此我需要将当前为黑底白字的区域反转。我该怎么做呢?我当前的代码:

# thresholding
def thresholding(image):
    # thresholds the image into a binary image (black and white)
    return cv2.threshold(image, 120, 255, cv2.THRESH_BINARY)[1]

【问题讨论】:

为什么常规 OCR 不能与您当前的阈值一起工作?图像不应被检测到,因此不应该成为问题? 我刚刚注意到经常会读出错误的数据。所以我有几种预处理方法,它最终会选择最高置信度的结果,通常这种方法的结果要好得多。这仍然是我遇到的主要障碍。 也许可以试试这个从图像中获取文本,然后运行你的 OCR:***.com/a/54125216/9178557 已经尝试过倒置阈值,但它不能解决问题,对吧?除非我能以某种方式组合生成的图像(从每张图像中取出白色背景区域) 【参考方案1】:

使用中值过滤器来估计主色(背景)。

然后从中减去图像...您将得到黑色背景上的白色文本。我正在使用 absolute 差异。反转为白底黑字。

im = cv.imread("thresh.jpg", cv.IMREAD_GRAYSCALE)
im = cv.pyrDown(cv.pyrDown(im)) # picture too large for stack overflow
bg = cv.medianBlur(im, 51) # suitably large kernel to cover all text
out = 255 - cv.absdiff(bg, im)

【讨论】:

这太棒了,效果很好。我得到的结果略有不同 i.ibb.co/C8Gg9y1/thresh-0.jpg 。这里的主要问题是例如顶部的名称,OCR 无法读取它。这很奇怪,因为我基本上复制了您的解决方案。为什么我会得到不同的结果.-. 我没有在我的解决方案中透露所有内容。我把输入缩小了几次。使用更大的内核大小来补偿。这是一个小提琴因素。 我明白了。例如,当我把它放在 75 上时效果更好。谢谢! 这是我见过的用于ocr操作的最好的图像处理方法。谢谢。

以上是关于OpenCV 将所有文本处理为白底黑字(分段)的主要内容,如果未能解决你的问题,请参考以下文章

单击时将文本添加到鼠标位置时会出现分段错误

白底黑字!Android浅色状态栏黑色字体模式(另)

python生成二维码

使用 OpenCV 识别模式

请教:nga无法正常显示,只有文字没有图片,白底

RGB的护眼值