8

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

在此处输入图像描述

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

from PIL import Image, ImageFilter

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

但是,它返回的细节比我需要的多得多。它基本上可以检测到包括房间墙壁在内的所有边缘。实际上,我需要的只是走廊的墙壁。所以我期待这样的事情

在此处输入图像描述

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

4

3 回答 3

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

在此处输入图像描述

于 2013-10-23T18:33:15.983 回答
0

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

于 2013-10-23T12:00:04.643 回答
0

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

于 2013-10-23T04:56:31.500 回答