OpenCV中的色块检测和标签

ahb*_*bon 1 python opencv color-detection

我的城市规划图如下:

城市规划

我想检测图像中的色块,并用不同的土地用途来标记它们,例如,草坪的绿色区域,居住区的粉红色,商业区域的浅蓝色等,最后,如果可能的话,请从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()
Run Code Online (Sandbox Code Playgroud)

卡尼边缘检测

J.D*_*.D. 5

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

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

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

我对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()
Run Code Online (Sandbox Code Playgroud)