一、利用bwperim来查找二值图像的边缘。
BW2 = bwperim(BW1)
BW2 = bwperim(BW1,conn)
BW2 = bwperim(BW1,conn)表示从输入图像BW1中返回只包括对象边缘像素点的图像。
conn的定义值如下:
对二维
4 4邻域
8 8邻域
对三维
6 6邻域
18 18邻域
26 26邻域
例子:
%读取原图
im = imread( filepath );
imshow(im);
title('原图');
% 转二值图像
bw = im2bw( im );
%轮廓提取
contour = bwperim(bw);
figure
imshow(contour);
title('轮廓')
bwperim局限性在于它不仅提取外轮廓, 对图形区域内部的孔洞所围成的内部边缘也提取出来。像如下图:
如果想只得到外形轮廓,则需要先进行填洞操作,后进行膨胀操作,去除孔、洞。填洞为imfill。
示例代码:
I = imread('1.jpg');
BW = im2bw(I,0.4);
BW2 = bwperim(BW,8);
%显示图像
subplot(1,2,1);imshow(I);title('original iamge');
subplot(1,2,2);imshow(BW2);title('bwperim');
%填充、膨胀处理
IBW = ~BW;
F1 = imfill(IBW,'holes');
SE = ones(3); %图像被结构元素SE膨胀
F2 = imdilate(F1,SE,'same');%膨胀操作
BW3 = bwperim(F2);
%显示图像:
subplot(1,2,1);imshow(I);title('original iamge');
subplot(1,2,2);imshow(BW3);title('operated bwperim');
二、借助edge()函数进行边缘检测
算子可以选择canny,soble等等。具体代码如下:
%读取原图
im = imread( filepath );
imshow(im);
title('原图');
% 转二值图像
bw = im2bw( im );
% 边界检测
contour = edge(bw ,'canny');
figure
imshow(contour);
title('边界')
其他算子的使用和效果可参见文章:http://www.doc88.com/p-243656000728.html