刘虾 2025-06-24 00:52 采纳率: 49.4%
浏览 17
已结题

python+opencv怎么将图像的断墨的黑色线/轮廓补全

python+opencv怎么将图像的断墨的黑色线/轮廓补全,图像是黑色背景,前景有很多白色方格,方格之间有黑色线分割,黑色线存在断墨,白色方格之间也存在白色粘连在一起,怎么将这个断墨的线填充为黑色,连接一起,分割开,形态学处理搞不定,有什么方法处理和提供代码

img

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-06-24 00:52
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    你可以使用 OpenCV 库中的 cv2.findContours 函数和 cv2.drawContours 函数来实现断墨线的补全。

    首先,使用 cv2.threshold 函数将图像转换为二值图像,然后使用 cv2.findContours 函数找到所有的黑色线。

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('image.jpg')
    
    # 将图像转换为二值图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
    # 找到所有的黑色线
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 遍历所有的黑色线
    for contour in contours:
        # 计算黑色线的面积
        area = cv2.contourArea(contour)
        # 如果黑色线的面积小于某个阈值,认为是断墨线
        if area < 100:
            # 使用 `cv2.drawContours` 函数将断墨线补全
            cv2.drawContours(img, [contour], -1, (0, 0, 0), 1)
    
    # 保存结果
    cv2.imwrite('result.jpg', img)
    

    在上面的代码中,我们首先将图像转换为二值图像,然后使用 cv2.findContours 函数找到所有的黑色线。然后,我们遍历所有的黑色线,如果黑色线的面积小于某个阈值,我们认为是断墨线,然后使用 cv2.drawContours 函数将断墨线补全。

    代码解释

    • cv2.threshold 函数将图像转换为二值图像, threshold 值为 0,意味着所有的像素值小于 0 的将被设置为 0,所有的像素值大于 0 的将被设置为 255。
    • cv2.findContours 函数找到所有的黑色线, RETR_EXTERNAL 参数指定了只找到外部的黑色线, CHAIN_APPROX_SIMPLE 参数指定了只保留黑色线的边缘。
    • 遍历所有的黑色线,然后计算黑色线的面积,如果黑色线的面积小于某个阈值,我们认为是断墨线。
    • 使用 cv2.drawContours 函数将断墨线补全, contour 参数指定了要补全的黑色线, -1 参数指定了要补全的所有黑色线, (0, 0, 0) 参数指定了要补全的颜色为黑色, 1 参数指定了要补全的线宽为 1。

    结果

    运行上面的代码后,你将得到一个补全了断墨线的图像。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月2日
  • 修改了问题 6月24日
  • 修改了问题 6月24日
  • 修改了问题 6月24日
  • 展开全部