利用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(边界)

其他算子的使用和效果可参见文章:

经验分享 程序员 微信小程序 职场和发展