参考上一篇: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
下面是处理前的图像:
下面是处理后被标记的区域,注意对应其在原图的位置: