我正在尝试对阿拉伯手稿执行 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
我知道这些都是非常简单的方法。这是我第一次做这么大的项目,所以任何帮助将不胜感激!
对于这种情况,您需要一个自适应阈值。
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
值。