參考上一篇:https://mp.csdn.net/console/editor/html/105642895
這次采用matlab的庫函數來進行膨脹和腐蝕,然後查找連通區域,對于每個連通區域,用紅色方框框選其最大的範圍。
膨脹:imdilate();
腐蝕:imerode();
查找連通區域:bwconncomp();
不多說,直接上代碼
%通過matlab函數實作大面積圖形查找
img=imread('ces0.bmp');
%關于img:img圖像中進行了二值化,非零值(白色1),零值(黑色0)
%其中圖像元素為非零值(白色1),圖像背景為零值(黑色0)
%對一個圖形進行二值化,根據各個像素對應的性質去進行
%二值化的條件具體根據需要而定(一般把感興趣的區域标定為1,背景标定為0)
img=im2bw(img,10/255);
sc=[0,1,0;1,1,1;0,1,0]; %用于膨脹的結構元素
imgo=imdilate(img,sc);%圖像img被結構元素sc膨脹
figure
imshow(imgo,[]);
sc2=ones(20,20);%用于腐蝕的結構元素
imgo2=imerode(imgo,sc2);%圖形imgo被結構元素sc2腐蝕
%查找二維圖形中的連通分量
CC=bwconncomp(imgo2);
RECT=zeros(CC.NumObjects,4); %存放所有的連通分量所在範圍--矩形範圍
for i=1:CC.NumObjects
left=CC.ImageSize(2);
up=CC.ImageSize(1);
right=0;
down=0;
for j=1:length(CC.PixelIdxList{1,i})
index=CC.PixelIdxList{1,i}(j);
col=ceil(index/CC.ImageSize(1));
row=mod(index,CC.ImageSize(1));
if row>down
down=row;
end
if row<up
up=row;
end
if col>right
right=col;
end
if col<left
left=col;
end
index=CC.PixelIdxList{1,i}(j);
end
RECT(i,:)=[left,up,right,down];
end
figure
imshow(imgo2,[]);
hold on
for i=1:CC.NumObjects
px=RECT(i,1);
py=RECT(i,2);
width=RECT(i,3)-RECT(i,1);
height=RECT(i,4)-RECT(i,2);
rectangle('Position',[px,py,width,height],'LineWidth',2,'EdgeColor','r');
end
下面是處理前的圖像:

下面是處理後被标記的區域,注意對應其在原圖的位置: