首页 > 解决方案 > OpenCV中的色块检测和标记

问题描述

我有一张城市规划图如下:

城市规划

我想检测图像中的色块并用不同的土地公用设施标记它们,例如,草坪的绿色区域,住宅区的粉红色,商业区的浅蓝色等,最后,如果可能的话,从 png 图片转换为形状文件供 ArcGis 使用。请分享您的想法,谢谢。我已经尝试过使用 OpenCV Canny 边缘检测,但离我需要的还很远:

import cv2
import numpy as np  

img = cv2.imread("test.png", 0)

img = cv2.GaussianBlur(img,(3,3),0)
canny = cv2.Canny(img, 50, 150)

cv2.imshow('Canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

Canny 边缘检测

标签: pythonopencvcolor-detection

解决方案


正如@Micka 所说,您的图像很容易在颜色上分离。我在下面提供了为深绿色执行此操作的代码。您可以轻松地编辑颜色选择器以获取其他颜色。

请注意,图像中存在像素伪影,可能是由于压缩造成的。当前的结果看起来不错,但我希望您可以访问完整质量的图像 - 那么结果将是最好的。

图像被转换为​​ HSV 颜色空间( image ) 以使选择颜色更容易。( openCV ) findContours返回一个列表,其中包含找到的每个形状的边界周围的坐标。

我对shapefile一无所知,但这也许一些用处。

结果:

在此处输入图像描述

代码:

# load image
img = cv2.imread("city.png")
# add blur because of pixel artefacts 
img = cv2.GaussianBlur(img, (5, 5),5)
# convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
# set lower and upper color limits
lower_val = (40, 100, 100)
upper_val = (60,255,200)
# Threshold the HSV image to get only green colors
mask = cv2.inRange(hsv, lower_val, upper_val)
# apply mask to original image
res = cv2.bitwise_and(img,img, mask= mask)
#show imag
cv2.imshow("Result", res)
# detect contours in image
im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw filled contour on result
for cnt in contours:
    cv2.drawContours(res, [cnt], 0, (0,0,255), 2)
# detect edges in mask
edges = cv2.Canny(mask,100,100)
# to save an image use cv2.imwrite('filename.png',img)
#show images
cv2.imshow("Result_with_contours", res)
cv2.imshow("Mask", mask)
cv2.imshow("Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

推荐阅读