你好吗?好吧,我需要帮助才能在 image.png 上找到所有填充的形状。 用户可以上传仅包含带有黑色边框的形状的 PNG,或者
更多细节:用户可以上传包含突出显示区域(实心非白色填充形状)的图片。图片代表一组“地形”(人们建造房屋的区域)。图像处理后应保留突出显示的区域,以便我在前端创建一个“图像映射”,用户可以在其中单击这些区域。
你能帮帮我吗?
以下是解决问题的步骤:如果有帮助
image = cv2.imread("image.png")
将图像转换为灰度:为了更容易检测填充形状,您应该使用 cv2.cvtColor() 方法将图像转换为灰度:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
对图像进行阈值处理:可以使用cv2.threshold()方法对图像进行阈值处理,转换为二值图像。您必须设置适当的阈值,以便将填充的形状与未填充的区域区分开来。例如,如果要检测填充有白色的区域,可以使用 200 的阈值。如果要检测填充有非白色纯色的区域,则可以使用较低的阈值。这是阈值的一个例子:
ret, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
查找轮廓:您可以使用 cv2.findContours() 方法在二值图像中查找填充形状的轮廓。您还应该使用 cv2.RETR_EXTERNAL 模式来仅检测外部边缘:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
过滤轮廓:您可以通过仅保留面积大于特定阈值的轮廓来过滤轮廓。这将消除与填充形状不匹配的小轮廓。可以使用cv2.contourArea()方法计算每条轮廓的面积:
min_area = 1000 # Définir la surface minimale pour conserver un contour
filled_contours = [] # Liste des contours remplis
for contour in contours:
area = cv2.contourArea(contour)
if area > min_area:
filled_contours.append(contour)
绘制轮廓:您可以使用 cv2.drawContours() 方法在原始图像上绘制过滤后的轮廓:
cv2.drawContours(image, filled_contours, -1, (0, 255, 0), 3)