user2881553
user2881553

Reputation:

Floor Plan Edge Detection - Image Processing?

I am a guy from a completely different discipline who need some Image Processing techniques to achieve this goal in a project. I need to derive the edges from an indoor floor plan, as shown below

enter image description here

I have tried this particular Python edge detect snippet:

from PIL import Image, ImageFilter

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

However, it is returning too much more details than I need. It basically detects all the edges including the room walls. Actaully, what I need are just the corridor walls. So I expect something like this

enter image description here

How may I do this? I am using Python, but any generic or general pointers or even some keywords are very much appreciated.

Upvotes: 8

Views: 6215

Answers (3)

Zaw Lin
Zaw Lin

Reputation: 5708

here's an example. you will need to have opencv package to run it.

there's a break there because the image has artifacts. if you use a higher quality image, it's probably going to be better. if you cant have a higher quality image, may be morphological operations can be used to connect the small gaps and remove quarter circle protrusions.

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

edit

did some preprocessing to fix the break

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

Upvotes: 8

scap3y
scap3y

Reputation: 1198

I agree with what @Eb Abadi has said about changing the color of your CAD model (if possible). Otherwise, use some masks (exactly the same size as the rooms) to essentially blur out all the edge details of the rooms and you will be left with only the halls and the outer walls.

Upvotes: 0

Eb Abadi
Eb Abadi

Reputation: 595

I guess you need some pre-processing before using the edge detector since no particular difference is seen between the room walls and the corridor. One idea is to choose different colors in the cad file and then help your detector to distinguish what you're looking for. Second one is to restrict your processing region in advance. Otherwise, I don't thing there is a straight forward technique you could apply and extract the corridor. Hope it helped.

Upvotes: 0

Related Questions