python - 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()
解决方案
正如@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()
推荐阅读
- android - Android SDK 28:无法获得访问 uvc usb 摄像头的 usbhost 权限
- kubernetes-helm - 使用 oci 注册表提取 helm 图表
- bash - 使用 set-output 作为工作流命令失败,退出代码为 3
- vba - 如何调用以 CSV/TEXT 文件格式存储的数据到范围
- python - 有没有办法根据标题中的内容获取 DataFrame 列索引号?
- bootstrap-5 - Bootstrap 5强制嵌套模态可见性
- javascript - 在 IOS 上反应语音到文本和文本到语音
- sql - SQL 查询以查找 Table1 中与 Table2 有一个关系但应该与同一个 Table2 有其他关系的记录
- keycloak - 哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?
- vue.js - 根据条件将 v-slot 元素包装在不同的父级中