利用MATLAB获取图像轮廓bwperim
一、利用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(边界)
其他算子的使用和效果可参见文章: