如何让每个房间平面图中图像的坐标通过对象标识方法?

18视图(30天)
我有一个平面图图像包含对象和墙壁。我现在删除所有对象在它只包含墙壁。现在我想把每个房间的坐标。
我是新到这个平台。有人能帮我每个房间的坐标怎么走?或者我可以得到每一个线段的终点?
这是代码。
函数[bbox_loc, sign_objects index1、圣、家具)= classify_objects_test1 (I1)
%清除所有;
% clc;
%关闭所有;
I_initial = imread (“C: \ \用户用户桌面\ \ \ \ \ \ tkinter_codes \ \平面布置图罗宾\ \ \ \ Dataset_3roomsmall \ \ Cat1_1.jpg“);
% I_initial = imread (“room_4.png”);
我= I_initial;
imshow(我);
SE = strel (“广场”10);
我= imdilate(我、SE);
SE = strel (“广场”10);
我= imerode(我、SE);
wall_image =我;
墙=我;
我= I_initial;
= im2bw墙(壁);
imshow(墙);
I = im2bw(我);
I = imcomplement(我);
= imcomplement墙(壁);
我= I-wall;
% imshow(我);
I = imcomplement(我);
SE = strel (“广场”1);
IM2 = imdilate(我,SE);
IM2 =我;
IM2 = imerode (IM2, SE);
imwrite (IM2“fl_0sym.tif”);
se1 = strel (“广场”8);
intm1 = imerode (IM2 se1);
se2 = strel (“广场”4);
intm2 = imdilate (intm1 se2);
intm3 = imdilate (intm2 se2);
imwrite (intm3“fl_0sym1.tif”);
我= imread (“fl_0sym1.tif”);
I = imcomplement(我);
J = imfill(我);
J = ~;
imwrite (J,“blb_0_1.jpg”);
图= I_initial;
[m, n] =大小(图);
图1 =图(:,:,(1 1 1));
图= im2bw(图);
[m, n] =大小(图);
形象= imread (“blb_0_1.jpg”);
BW = im2bw(图片);
BW = imresize (BW (m, n));
BW = ~ BW;
% 4,1 9 8
SE = strel (“广场”10);
BW = imdilate (BW, SE);
% %图;imshow (BW);
圣= regionprops (BW,的边界框(“大小));
形状。隔板= vision.ShapeInserter (“线宽”4“BorderColor”,“自定义”,“CustomBorderColor”uint8 ((255 0 0)));
str_ele = strel (“磁盘”1 0);
k = 1:长度(st)
% k = 1;
% k = 1:1
thisBB =圣(k) .BoundingBox;
%图1 =步(图1,shape.Inserter bbox_loc {k});
* thisBB thisBBarea = thisBB (3) (4);
如果thisBB (3) > 20 & & thisBB (4) > 20
矩形= int32 ([thisBB (1) thisBB (2), thisBB (3), thisBB (4)]);
结束
如果(thisBBarea > 870)
bbox_loc {k} =矩形;
矩形crop_I_new = imcrop(图1);
crop_I_new_gray = rgb2gray (crop_I_new);
crop_I = im2bw (crop_I_new_gray, 0.7);
%图;imshow (crop_I);
签名{k} = signature_find (crop_I);
如果{k} isempty(签名)
签名{k} = (99999、99999、99999);
结束
图1,图1 =步骤(shape.Inserter bbox_loc {k});
结束
结束
签名=签名(~ cellfun (“isempty”、签名);
保存(“signature.mat”,“签名”);
签名=负载(“signature.mat”);
sign_objects =负载(“sign_object2”);
i = 1:长度(signature.signature)
j = 1:长度(sign_objects.sign_object2)
diff {i, j} = abs (signature.signature {1,} -sign_objects.sign_object2 {j, 1} .count);
结束
结束
(i = 1:尺寸(diff, 1))
(j = 1:尺寸(diff, 2))
如果(sign_objects.sign_object2 {j, 1} .count (3) > 1000)
temp1 (i, j) = diff {i, j} (1) + diff {i, j} (2);
其他的
temp1 (i, j) = diff {i, j} (1) + diff {i, j} (2) + diff {i, j} (3);
结束
结束
结束
(i = 1:尺寸(temp1, 1))
[temp1_min(我),index1 (i)) = min (temp1(我,:));
disp (sign_objects.sign_object2 {index1(我),2});
家具{我1}= sign_objects.sign_object2 {index1(我),2}
图;imshow(图1);
bbox_loc = bbox_loc (~ cellfun (“isempty”bbox_loc));
结束
k = 1:长度(bbox_loc)
k H =文本(双(bbox_loc{}(1)),双(bbox_loc {k} (2)), sign_objects.sign_object2 {index1 (k), 2});
集(gcf,“DefaultTextColor”,“蓝”)
结束
% i = 1:尺寸(diff, 1)
% j = 1:尺寸(diff, 2)
%
% temp1 (i, j) = (diff {i, j} (1));
% temp2 (i, j) = (diff {i, j} (2));
% temp3 (i, j) = (diff {i, j} (3));
%
%
%结束
% (temp1_min(我),index1 (i)) = min (temp1(我,:));
% disp (sign_objects.sign_object1 {index1(我),2});
%家具{我1}= sign_objects.sign_object1 {index1(我),2}
%结束
我附加一个zip文件,其中包含文件将使用这段代码在运行。
这是平面布置图的图像对象。
这是图像只有墙壁。

接受的答案

马特·J
马特·J 2020年5月10日
编辑:马特·J 2020年5月10日
一种方法是关闭所有的门形态:
负载(“墙”)
e = 1 (1105);
一个= imclose (imclose(~形象,e), e。');
B = imfill (A,“黑洞”)& ~;
imshow (B)
现在,您可以简单地使用 regionprops 在每个房间所有的像素坐标,
> >房间= regionprops (B,“PixelList”)
房间=
3×1结构数组字段:
PixelList
7评论
马特·J
马特·J 2020年5月17日
我认为你应该开始一个新的问题为这更复杂的情况。它看起来像它可能需要不同的解决方案。

登录置评。

答案(1)

马特·J
马特·J 2020年5月9日
7评论

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!