BoundingBox 图片分割

Question:


将以下A4纸上的线条单独识别出来。

Answer:

function segmentation
img=imread('input.png');
f=im2double(img);
%ãÐÖµ·Ö¸îËã·¨¡ª¡ªµü´ú·¨
T=0.5*(min(f(:))+max(f(:))); 
done=false; 
while ~done 
    g=f>=T;
    Tn=0.5*(mean(f(g))+mean(f(~g)));
    done=abs(T-Tn)<0.1;
    T=Tn; 
end
threshold=im2bw(f,T);                                
subplot(121),imshow(img),title('ԭͼ');           
subplot(122),imshow(threshold),title('ãÐÖµ·Ö¸îËã·¨');
 
%ÂÖÀªÌáÈ¡       
% ±ß½ç¼ì²â  
%b=edge(r,'Canny',0.2);
%figure
%imshow(b);
%d=imfill(b,'hole');
 
%ÐÎ̬ѧͼÏñ´¦Àí¡ª¡ª¸¯Ê´
se1=strel('disk',4);
bw1=imerode(threshold,se1);
figure
imshow(bw1), title('¸¯Ê´ºóµÄͼÏñ');
 
%ÂÖÀªÌáÈ¡
outline = bwperim(bw1); 
figure    
imshow(outline);    
title('ÂÖÀª') 
[l,m]=bwlabel(outline,8);
status=regionprops(l,'BoundingBox');
figure
imshow(outline), title('¾ØÐÎÂÖÀªÌáÈ¡');hold on;
for i=1:m
     rectangle('position',status(i).BoundingBox,'edgecolor','green');
end
%{
disp (m);
disp (status(1).BoundingBox);
disp (status(2).BoundingBox);
disp (status(3).BoundingBox);
disp (status(4).BoundingBox);
disp (status(5).BoundingBox);
disp (status(6).BoundingBox);
disp (status(7).BoundingBox);
disp (status(8).BoundingBox);
%}
output1 = imcrop(img,[status(2).BoundingBox(1),status(2).BoundingBox(2),status(2).BoundingBox(3),status(2).BoundingBox(4)]);
output2 = imcrop(img,[status(3).BoundingBox(1),status(3).BoundingBox(2),status(3).BoundingBox(3),status(3).BoundingBox(4)]);
output3 = imcrop(img,[status(4).BoundingBox(1),status(4).BoundingBox(2),status(4).BoundingBox(3),status(4).BoundingBox(4)]);
output4 = imcrop(img,[status(5).BoundingBox(1),status(5).BoundingBox(2),status(5).BoundingBox(3),status(5).BoundingBox(4)]);
output5 = imcrop(img,[status(6).BoundingBox(1),status(6).BoundingBox(2),status(6).BoundingBox(3),status(6).BoundingBox(4)]);
output6 = imcrop(img,[status(7).BoundingBox(1),status(7).BoundingBox(2),status(7).BoundingBox(3),status(7).BoundingBox(4)]);
output7 = imcrop(img,[status(8).BoundingBox(1),status(8).BoundingBox(2),status(8).BoundingBox(3),status(8).BoundingBox(4)]);
figure
imshow(output1);
figure
imshow(output2);
figure
imshow(output3);
figure
imshow(output4);
figure
imshow(output5);
figure
imshow(output6);
figure
imshow(output7);
end
Algorithm description:

1.阈值分割——迭代法
迭代法是基于逼近的思想,其步骤如下:
(1)求出图象的最大灰度值和最小灰度值,分别记为ZMAX和ZMIN,令初始阈值T0=(ZMAX+ZMIN)/2;
(2)根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZO和ZB;
(3)求出新阈值TK+1=(ZO+ZB)/2;
(4)若TK=TK+1,则所得即为阈值;否则转2,迭代计算。
%阈值分割算法——迭代法
T=0.5*(min(f(:))+max(f(:))); 
done=false; 
while ~done 
    g=f>=T;
    Tn=0.5*(mean(f(g))+mean(f(~g)));
    done=abs(T-Tn)<0.1;
    T=Tn; 
end
threshold=im2bw(f,T); 
 
2.形态学图像处理——腐蚀
%形态学图像处理——腐蚀
se1=strel('disk',4);
bw1=imerode(threshold,se1);
 
3.轮廓检测与提取
outline = bwperim(bw1); 
figure    
imshow(outline);    
title('轮廓') 
[l,m]=bwlabel(outline,8);
status=regionprops(l,'BoundingBox');
figure
imshow(outline), title('矩形轮廓提取');hold on;
for i=1:m
     rectangle('position',status(i).BoundingBox,'edgecolor','green');
end
Result:


--------------------- 
作者:qq_34200964 
来源:CSDN 
原文:https://blog.csdn.net/qq_34200964/article/details/79528579 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值