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

效果图:

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


阿里嘎多学长整理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 函数绘制多边形。