原图
首先将图片导入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('边界')