I have a floorplan image with only walls. I want to identify the room coordinates of the floorplan.
This code actually closes the doors and identifies the rooms in the floorplan. This works well when shape of the rooms is rectangles. But It does not work well when the shape is either trapezium or L shape. Can somebody help me please?
Also it is not closing all the doors properly.
load('Walls')
e=ones(1,105);
A=imclose(imclose(~Image,e),e.');
B=imfill(A,'holes')&~A;
imshow(B)

4 Kommentare

Matt J
Matt J am 19 Mai 2020
Will the doorways always be horizontal/vertical? And what example of an " L shape" didn't work? It seems to have worked well on the L-shaped flllor plan here:
L shape in the sense the shape of the room.In the example floorplan is L shaped but the rooms are rectangles. In the case where the rooms are either trapezium shaped or L shaped, the above code is not working properly
Matt J
Matt J am 19 Mai 2020
And what about the doorways?
Not all the doors are closed but if I increase the number in ones() then they are being closed

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

darova
darova am 19 Mai 2020

1 Stimme

I skeletonized the image and found endpoints with bwmorph. Found shortest distances and connected points
I0 = imread('image.jpeg');
I1 = im2bw(I0); % binarize image
I2 = bwmorph(~I1,'skel',inf); % make thin lines
I3 = bwmorph(I2,'spur',10); % remove spurs
B = bwmorph(I3,'endpoints'); % find free ends (endpoints)
[ii,jj] = find(B); % find rows and columns of endpoints
D = pdist2([ii(:) jj(:)],[ii(:) jj(:)]); % find distances
D(D<1e-3) = nan; % remove zeros
[~,ix] = min(D); % find shortest distances
for i = 1:length(ix)
i1 = ii(i):ii(ix(i));
j1 = jj(i):jj(ix(i));
I3(i1,j1) = 1; % connect door ends
end
I4 = imdilate(I3,ones(15)); % make lines thicker
imshowpair(I0,I4) % display original and modificated images
Result

5 Kommentare

does the regionprops() gives only rectangular bounding boxes?
Also it is not giving correct answer for other images.
Example:For this
The result I am getiing is
darova
darova am 21 Mai 2020
Bearbeitet: darova am 21 Mai 2020
  • does the regionprops() gives only rectangular bounding boxes?
rectangular box can be only rectangular
  • Also it is not giving correct answer for other images.
It's because there is no space between walls and margins
Try to add space
I0 = imread('image.jpeg');
[m,n,~] = size(I0);
I1 = ones(m+2,n+2);
I1(2:end-1,2:end-1) = im2bw(I0); % binarize image
Are your images always have white background?
Yes they always have white backgrounds. How can I get the coordinates of each room if the bounding box is only rectangular in shape. I mean how can I get the coordinates of those rooms which are not in rectangular shape
You can label image with bwlabel and select each region separately
[L,n] = bwlabel(I);
for i = 1:n
I = L == i;
imshow(I)
pause(0.5)
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by