对下图二值化后求轮廓。

希望把 文字轮廓提取出来。
但二值化的阈值怎么也无法兼顾。
如果阈值取小,比如100,那么就无法提取文字

如果阈值取大,比如180,那么屏幕就不完整

对下图二值化后求轮廓。

希望把 文字轮廓提取出来。
但二值化的阈值怎么也无法兼顾。
如果阈值取小,比如100,那么就无法提取文字

如果阈值取大,比如180,那么屏幕就不完整

关注引自免费微信小程序:皆我百晓生:
在图像处理中,对于灰度图像进行二值化以提取文字轮廓时,通常需要根据图像的具体情况进行阈值调整。从您的描述来看,当阈值较小(例如100)时,背景与部分文字的灰度差异不大,导致文字无法有效分离;而当阈值较大(例如180)时,虽然文字能够较好地被提取出来,但图像整体可能会丢失一些细节或出现不完整的状况。
针对这种问题,可以尝试以下方法:
自适应阈值:使用局部自适应阈值来代替全局固定阈值。OpenCV库中的cv2.adaptiveThreshold()函数可以根据图像的局部区域动态确定阈值,这样可以更好地应对光照不均或者背景复杂的场景。
示例代码:
import cv2
# 假设 img 是读取的灰度图像
img_gray = cv2.imread('your_image.png', cv2.IMREAD_GRAYSCALE)
# 使用自适应阈值
thresh = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对于每个轮廓,可以进一步进行操作...
Otsu's 阈值:这是一种自动寻找最优阈值的方法,它基于图像直方图分布特性,将图像分为前景和背景两类,并最大化这两类之间的类间方差。
示例代码:
import cv2
# 计算 Otsu's 阈值并应用
img_gray = cv2.imread('your_image.png', cv2.IMREAD_GRAYSCALE)
_, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 提取轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对于每个轮廓,可以进一步进行操作...
预处理:在二值化之前,对图像进行噪声去除和平滑处理(如高斯滤波),以便更好地凸显文字边缘。
多尺度尝试:尝试不同尺度下的阈值或自适应阈值,选取效果最佳的参数组合。
其他技术:还可以考虑使用形态学操作(如膨胀、腐蚀)增强文字边界后再进行二值化。
请确保您已正确读取图像,并且该图像为灰度图像。由于我无法直接查看您的图片,以上建议仅供参考,实际效果可能需要根据具体图像内容微调。