我是一个完全不同的学科的人,他需要一些图像处理技术来实现项目中的这个目标。我需要从室内平面图中推导出边缘,如下所示
我尝试过这个特殊的Python边缘检测片段:
from PIL import Image, ImageFilter
image = Image.open('L12-ST.jpg')
image = image.filter(ImageFilter.FIND_EDGES)
image.save('new_name.png')
然而,它返回的细节远远超出我的需要。它基本上检测所有边缘,包括房间墙壁。实际上,我需要的只是走廊的墙壁。所以我希望这样的事情
我怎么能这样做?我正在使用Python,但非常感谢任何通用或通用指针甚至某些关键字。
答案 0 :(得分:8)
这是一个例子。你需要有opencv包才能运行它。
那里有休息因为图像有伪影。如果你使用更高质量的图像,它可能会更好。如果你不能拥有更高质量的图像,可以使用形态学操作来连接小间隙并去除四分之一圆周突起。
import cv2
import numpy as np
img = cv2.imread('c:/data/floor.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=255-gray
contours,hierarchy = cv2.findContours(gray,cv2.RETR_LIST ,cv2.CHAIN_APPROX_NONE )
for cnt in contours:
area = cv2.contourArea(cnt)
if area>9000 and area<40000:
cv2.drawContours(img,[cnt],0,(255,0,0),2)
cv2.imshow('img',img)
cv2.waitKey()
进行了一些预处理来修复中断
import cv2
import numpy as np
img = cv2.imread('c:/data/floor.jpg')
img=cv2.resize(img,(1700,700))
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=255-gray
gray=cv2.threshold(gray,4,255,cv2.THRESH_BINARY)[1]
gray=cv2.blur(gray,(15,1))
contours,hierarchy = cv2.findContours(gray,cv2.RETR_LIST ,cv2.CHAIN_APPROX_NONE )
for cnt in contours:
area = cv2.contourArea(cnt)
if area>150000 and area<500000:
cv2.drawContours(img,[cnt],0,(255,0,0),2)
cv2.imshow('img',img)
cv2.waitKey()
答案 1 :(得分:0)
我猜你在使用边缘探测器之前需要进行一些预处理,因为房间墙壁和走廊之间没有特别的区别。 一个想法是在cad文件中选择不同的颜色,然后帮助您的探测器区分您正在寻找的东西。 第二个是提前限制您的处理区域。 否则,我不知道你可以应用并提取走廊的直接技术。 希望它有所帮助。
答案 2 :(得分:0)
我同意@Eb Abadi关于改变CAD模型颜色的说法(如果可能的话)。否则,使用一些面具(与房间大小完全相同)来基本上模糊房间的所有边缘细节,您将只留下大厅和外墙。