平面图边缘检测 - 图像处理?

时间:2013-10-23 03:55:39

标签: python opencv image-processing

我是一个完全不同的学科的人,他需要一些图像处理技术来实现项目中的这个目标。我需要从室内平面图中推导出边缘,如下所示

enter image description here

我尝试过这个特殊的Python边缘检测片段:

from PIL import Image, ImageFilter

image = Image.open('L12-ST.jpg')
image = image.filter(ImageFilter.FIND_EDGES)
image.save('new_name.png') 

然而,它返回的细节远远超出我的需要。它基本上检测所有边缘,包括房间墙壁。实际上,我需要的只是走廊的墙壁。所以我希望这样的事情

enter image description here

我怎么能这样做?我正在使用Python,但非常感谢任何通用或通用指针甚至某些关键字。

3 个答案:

答案 0 :(得分:8)

这是一个例子。你需要有opencv包才能运行它。

那里有休息因为图像有伪影。如果你使用更高质量的图像,它可能会更好。如果你不能拥有更高质量的图像,可以使用形态学操作来连接小间隙并去除四分之一圆周突起。

enter image description here

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()

enter image description here

答案 1 :(得分:0)

我猜你在使用边缘探测器之前需要进行一些预处理,因为房间墙壁和走廊之间没有特别的区别。 一个想法是在cad文件中选择不同的颜色,然后帮助您的探测器区分您正在寻找的东西。 第二个是提前限制您的处理区域。 否则,我不知道你可以应用并提取走廊的直接技术。 希望它有所帮助。

答案 2 :(得分:0)

我同意@Eb Abadi关于改变CAD模型颜色的说法(如果可能的话)。否则,使用一些面具(与房间大小完全相同)来基本上模糊房间的所有边缘细节,您将只留下大厅和外墙。