Reputation:
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
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
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
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.
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()
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()
Upvotes: 8
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
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