czxt3000 2024-02-07 06:58 采纳率: 59.8%
浏览 18
已结题

二值化求轮廓的阈值问题。

对下图二值化后求轮廓。

img

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

img

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

img

  • 写回答

14条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-07 06:58
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    在图像处理中,对于灰度图像进行二值化以提取文字轮廓时,通常需要根据图像的具体情况进行阈值调整。从您的描述来看,当阈值较小(例如100)时,背景与部分文字的灰度差异不大,导致文字无法有效分离;而当阈值较大(例如180)时,虽然文字能够较好地被提取出来,但图像整体可能会丢失一些细节或出现不完整的状况。

    针对这种问题,可以尝试以下方法:

    1. 自适应阈值:使用局部自适应阈值来代替全局固定阈值。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)
      
      # 对于每个轮廓,可以进一步进行操作...
      
    2. 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)
      
      # 对于每个轮廓,可以进一步进行操作...
      
    3. 预处理:在二值化之前,对图像进行噪声去除和平滑处理(如高斯滤波),以便更好地凸显文字边缘。

    4. 多尺度尝试:尝试不同尺度下的阈值或自适应阈值,选取效果最佳的参数组合。

    5. 其他技术:还可以考虑使用形态学操作(如膨胀、腐蚀)增强文字边界后再进行二值化。

    请确保您已正确读取图像,并且该图像为灰度图像。由于我无法直接查看您的图片,以上建议仅供参考,实际效果可能需要根据具体图像内容微调。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月15日
  • 创建了问题 2月7日