刘虾 2025-06-13 08:17 采纳率: 49.4%
浏览 26
已结题

python+opencv怎么提取二值化图像的白色方格的区域

python+opencv怎么提取二值化图像的白色方格的区域,同一行的方格是不是同一个高度的,不是平齐的,所有白色方格画一个区域包围,图像有很多噪点
原图:

img


效果图:

img

  • 写回答

8条回答 默认 最新

  • 阿里嘎多学长 2025-06-13 08:17
    关注

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

    解决方案

    你可以使用 OpenCV 库中的 findContours 函数来提取图像中的白色方格,然后使用 boundingRect 函数来计算每个方格的边界框。最后,你可以使用 drawContours 函数来绘制每个方格的边界框。

    以下是一个示例代码:

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('image.png')
    
    # 二值化图像
    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:
        # 计算方格的边界框
        x, y, w, h = cv2.boundingRect(contour)
        # 绘制方格的边界框
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
    # 显示结果
    cv2.imshow('image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    这个代码首先读取图像,然后将图像转换为灰度图像,并使用 threshold 函数将图像二值化。然后,它使用 findContours 函数找到图像中的白色方格,并遍历每个方格,计算其边界框,并使用 rectangle 函数绘制边界框。最后,它显示结果。

    处理噪点

    如果图像中存在噪点,可以使用 medianBlur 函数来对图像进行中值滤波,以减少噪点的影响。

    img = cv2.medianBlur(img, 5)
    

    其中,5 是滤波器的大小。

    处理非平齐的方格

    如果同一行的方格不是同一个高度,可以使用 houghLines 函数来检测图像中的直线,然后使用 sort 函数来排序每个方格的高度。

    lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 200, minLineLength=100, maxLineGap=10)
    lines = sorted(lines, key=lambda x: x[1][1])
    

    其中,HoughLinesP 函数检测图像中的直线,sort 函数排序每个方格的高度。

    绘制区域

    如果你想绘制每个方格的区域,可以使用 fillPoly 函数来绘制多边形。

    cv2.fillPoly(img, [contour], (0, 255, 0))
    

    其中,contour 是每个方格的边界框,fillPoly 函数绘制多边形。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月13日
  • 创建了问题 6月13日