如何优化文本文档二值化:修复字符缺像素、降噪、避免文字断裂缺失
二值化文字断裂问题优化方案
一、现有参数调优方案
- 高斯模糊核调整:当前使用的(103,103)核过大,会过度抹平文字区域的局部灰度差,建议根据图像分辨率调整为输入图像短边的1/20~1/10大小的奇数核,避免局部亮度校正过度。
- 非锐化掩膜参数调整:当前
amount=5过高,会放大噪点同时导致文字边缘过度锐化出现断层,建议把amount降到1.53区间,`radius`根据文字笔画粗细调整为12即可。 - 全局阈值替换:全局OTSU阈值对光照不均的场景适配性差,建议优先选择局部阈值算法,适配不同区域的亮度差异。
二、形态学操作插入时机与选择
插入位置固定为二值化处理完成后,不要在灰度处理阶段执行,避免破坏灰度分布导致后续阈值分割误差更大:
- 针对文字断裂优先使用闭运算(Closing):逻辑为先膨胀后腐蚀,能够在不改变文字整体位置和大小的前提下,填充笔画内部的孔洞、连接断裂的笔画,核选择3x3或5x5的矩形/十字形结构元即可,文字笔画越粗可适当调大核的尺寸,示例代码如下:
# 二值化后添加该段代码 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
- 若处理后同时存在背景噪点,可在闭运算之后加一次开运算(Opening):逻辑为先腐蚀后膨胀,可去除孤立的背景噪点,不会影响已经连接好的文字笔画。
- 不建议单独使用膨胀操作:会导致文字笔画变粗粘连,反而降低可读性。
三、适配多数场景的二值化技术优化
- 可选Sauvola阈值算法:专门针对文档图像二值化设计的算法,比普通自适应阈值效果更好,对低对比度、光照不均的文字场景适配性极强,基本可以避免大部分断裂问题。
- 新增对比度预处理:在灰度化之后、高斯模糊之前加入限制对比度自适应直方图均衡(CLAHE),提升文字和背景的对比度,减少后续阈值分割的误差。
优化后完整代码示例
import cv2 import numpy as np import skimage.filters as filters def convert(path): img = cv2.imread(path) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 新增:CLAHE提升局部对比度 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) gray = clahe.apply(gray) # 调整高斯核尺寸,可根据实际图像分辨率调整 smooth = cv2.GaussianBlur(gray, (21,21), 0) division = cv2.divide(gray, smooth, scale=255) # 调优非锐化参数 sharp = filters.unsharp_mask(division, radius=1.5, amount=2, multichannel=False, preserve_range=False) sharp = (255*sharp).clip(0,255).astype(np.uint8) # 替换为Sauvola局部阈值 thresh_sauvola = filters.threshold_sauvola(sharp, window_size=15, k=0.1) thresh = (sharp > thresh_sauvola).astype(np.uint8) * 255 # 新增闭运算连接断裂笔画 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) return thresh
内容的提问来源于stack exchange,提问作者Deshwal
相关产品推荐
相关产品推荐

