检测图像上的填充多边形

问题描述 投票:0回答:1

你好吗?好吧,我需要帮助才能在 image.png 上找到所有填充的形状。 用户可以上传仅包含带有黑色边框的形状的 PNG,或者

  1. 纯白色填充颜色
  2. 纯非白色填充颜色 我应该能够消除填充白色的形状(边框颜色无关紧要)。

更多细节:用户可以上传包含突出显示区域(实心非白色填充形状)的图片。图片代表一组“地形”(人们建造房屋的区域)。图像处理后应保留突出显示的区域,以便我在前端创建一个“图像映射”,用户可以在其中单击这些区域。

你能帮帮我吗?

python opencv detection
1个回答
0
投票

以下是解决问题的步骤:如果有帮助

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)
© www.soinside.com 2019 - 2024. All rights reserved.