有没有有效的图像二值化方法可以处理不同亮度的文本?

问题描述 投票:0回答:1

我正在尝试对阿拉伯手稿执行 OCR,但在对图像进行二值化时遇到困难(即确保文本区域的强度为 0,背景区域的强度为 255)。

大津的阈值 自适应阈值

大津的阈值处理在不同亮度级别的情况下似乎不是很有效。我将此算法应用于示例图像(见下文),有几个区域没有文本,但显示为黑色。我还应用了自适应阈值算法,可以更好地对图像进行二值化,但现在整个图像中有很多噪声。我使用的代码如下:

def 二值化_图像(图像):

# binarized_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 2)
threshold, binarized_image = cv2.threshold(image, 0, 255,  cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binarized_image

我知道这些都是非常简单的方法。这是我第一次做这么大的项目,所以任何帮助将不胜感激!

opencv computer-vision ocr image-segmentation
1个回答
0
投票

对于这种情况,您需要一个自适应阈值。

ADAPTIVE_THRESH_GAUSSIAN_C
应该给出最好的结果。 但您应该对块大小进行实验。 我认为你的值 11 太小了。块大小越大,T(x,y) 阈值就越平滑,输出的噪声就越小。

for block_size in range(15, 40, 6):
    print(f'Attempt {block_size=}')
    binarized_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, block_size, 2)

您还可以尝试最后一个参数,

C=2
。这被添加到阈值(或减去?),因此它代表二进制截止值。使用较大的
C
会减少噪音,但也可能会删除脚本中的细节。

找到最佳

block_size
后,再运行另一个实验以找到最佳
C
值。

© www.soinside.com 2019 - 2024. All rights reserved.