使用Open CV转黑白效果不佳,如何实现高精度黑白图像转换?
高精度黑白二值图像转换实现方法
普通全局阈值工具仅适合光照均匀、前后景对比度极高的简单场景,要达到参考样例级别的高精度转换效果,可以直接使用以下几类成熟方案,均支持快速落地:
- 自适应局部阈值法
全局阈值对整张图使用统一判定值,遇到局部明暗不均的素材会出现大面积过曝/欠曝。OpenCV原生提供的cv2.adaptiveThreshold接口会为每个像素单独参考其邻域亮度计算阈值,能很好适配局部光照差异,基础调用代码如下:
该方法处理线稿、印刷品类素材的效果远好于普通全局阈值,调参成本低。import cv2 # 读入灰度图 gray_img = cv2.imread("your_input.jpg", 0) # 邻域块大小、阈值偏移量可根据素材实际效果微调 bw_result = cv2.adaptiveThreshold( gray_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=15, C=10 ) - Sauvola阈值算法
这是专门针对文档、手绘素材优化的局部二值化算法,噪点控制能力、边缘干净程度比OpenCV原生自适应阈值更优,非常接近专业扫描设备输出的黑白效果,可以直接调用scikit-image内置实现:
你给出的参考样例如果是文档、手绘线稿类效果,该算法经过简单调参基本可以直接匹配。import cv2 import numpy as np from skimage.filters import threshold_sauvola gray_img = cv2.imread("your_input.jpg", 0) # window_size建议取奇数,k值通常在0.1-0.3区间调整 threshold_map = threshold_sauvola(gray_img, window_size=25, k=0.2) bw_result = (gray_img > threshold_map).astype(np.uint8) * 255 - 预训练深度学习二值化模型
如果需要处理复杂实景拍摄的素材(比如带阴影、背景杂物、光照极差的拍摄文档/物体),传统算法调参成本较高,可以直接使用DIBCO文档二值化竞赛的开源预训练模型,无需从零训练,推理输出的边缘精度、抗干扰能力远高于传统算法,适合对效果要求极高的生产场景。
实用技巧:二值化处理前可以先对灰度图做一次3*3核的高斯模糊
cv2.GaussianBlur(gray_img, (3,3), 0),去除原图细碎噪点,最终输出的黑白图线条会更顺滑,不会出现大量孤立杂点。
参考效果样例


内容的提问来源于stack exchange,提问作者Tariq Hussain Dahri
相关产品推荐
相关产品推荐

