使用matlab对图像轮廓进行提取

原图 

首先将图片导入matlab工作区 图片将会被转换为一个二维矩阵存=存放

 然后我们输入指令可以看到原图

然后转为二值图像使用bwperim()函数进行轮廓提取

同样我们可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。 

算子是什么呢?

简单的说就是一种运算方式,一种关系,一种映射。

广义的讲,对任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开方都可以认为是一个算子,只是有的算子我们用了一个符号来代替他所要进行的运算罢了,所以大家看到算子就不要纠结,他和  的  没区别,它甚至和加减乘除的基本运算符号都没有区别,只是他可以对单对象操作罢了(有的符号比如大于、小于号要对多对象操作)。又比如取概率P{X<x},概率是集合{X<x}(他是属于实数集的子集)对[0,1]区间的一个映射,我们知道实数域和[0,1]区间是可以一一映射的(这个后面再说),所以取概率符号P,我们认为也是一个算子,和微分,积分算子算子没区别。总而言之,算子就是映射,就是关系,就是变换。 

关于算子的选择可以看这篇博文https://blog.csdn.net/KYJL888/article/details/78253053

我们可以使用im2=imfill(im,'holes'); 看字面意思就知道是对于孔洞的填充,所以填充的要是封闭连续的图形

 

关于边界和轮廓

边缘检测主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。如canny边缘检测,结果通常保存在和源图片一样尺寸和类型的边缘图中。轮廓检测指检测图像中的对象边界,如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的索引编号。

边缘检测是检测数字图像中明暗变化剧烈或者说是不变化不连续的像素点。

轮廓检测是指检测图像中的对象边界。

图像的轮廓检测通常可以先检测边缘,再将检测到的边缘进行进一步处理,得到图像的轮廓。图像分割也需要先对边缘进行检测,因此可以说边缘检测是图像分割与轮廓检测的基础性工作。

对于另一个概念图像分割就很好理解,它是指将数字图像分割成多个图像小块(即像素集合,如超像素)的过程。

常用的算法:

  • 图像分割:N-cut, Meanshift, Watershed
  • 边缘检测: Canny, Sobel, Roberts, Prewitt, Log
  • 轮廓检测: gPb

最后源代码:

%读取原图  
im = imread( filepath );                
imshow(im);  
title('原图');                         
  
% 转二值图像  
bw = im2bw( im );                         
  
%轮廓提取     
contour = bwperim(bw);                    
figure  
imshow(contour);  
title('轮廓')  
                       
% 边界检测  
contour = edge(bw ,'canny');  
figure  
imshow(contour);  
title('边界')  
  • 25
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
Matlab可以使用边缘检测算法对图像进行轮廓提取,常用的算法包括Sobel算子、Prewitt算子、Canny算子等。其中,Canny算子效果较好且常用,可以按照以下步骤进行: 1. 读入图像数据集,可使用imread函数; 2. 将图像转为灰度图像,可使用rgb2gray函数; 3. 对灰度图像进行高斯滤波,可使用imgaussfilt函数; 4. 对滤波后的图像进行Canny边缘检测,可使用edge函数; 5. 对检测到的边缘进行二值化处理,可使用imbinarize函数; 6. 可以对二值化后的边缘进行形态学处理,如膨胀、腐蚀等,可使用imdilate、imerode函数; 7. 最终得到的轮廓提取结果可以使用imcontour函数进行可视化。 具体的代码实现可以参考以下示例: ```matlab % 读入图像数据集 img = imread('example.jpg'); % 将图像转为灰度图像 grayImg = rgb2gray(img); % 对灰度图像进行高斯滤波 filteredImg = imgaussfilt(grayImg, 2); % 对滤波后的图像进行Canny边缘检测 edgeImg = edge(filteredImg, 'Canny', [0.05, 0.2]); % 对检测到的边缘进行二值化处理 binarizedImg = imbinarize(edgeImg); % 对二值化后的边缘进行形态学处理 dilatedImg = imdilate(binarizedImg, strel('disk', 2)); erodedImg = imerode(dilatedImg, strel('disk', 2)); % 可以使用imcontour函数进行可视化 imcontour(erodedImg); ``` 注意,以上示例仅供参考,具体的参数设置和算法选择需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值