转自:http://blog.csdn.net/q1302182594/article/details/50394576

本文主要总结一下在matlab中可用于进行轮廓提取的函数。

1 bwperim

根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下:

%读取原图
im = imread( filepath );
imshow(im);
title('原图');                         % 转二值图像
bw = im2bw( im );                         %轮廓提取
contour = bwperim(bw);
figure
imshow(contour);
title('轮廓')  

原图和所提取的轮廓分别如图1和图2所示。

图1 原图


                    图2 轮廓

2 edge

可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。具体代码如下:

%读取原图
im = imread( filepath );
imshow(im);
title('原图');                         % 转二值图像
bw = im2bw( im );
% 边界检测
contour = edge(bw ,'canny');
figure
imshow(contour);
title('边界')  
对图1的检测效果如图3所示:


                       图3 edge检测结果

参考资料

[1]轮廓提取

[2]matlab 二值图像 外轮廓提取

[3]matlab 二进制图像轮廓提取

============================================================================================

============================================================================================

转自:http://blog.sina.com.cn/s/blog_6f2d29af0101065p.html

**注意:填充时,轮廓线是闭合连续的

im=imread(filepath);                %读取原图
figure,imshow(im,[]);title('Raw');  %显示原图im=im2bw(im);                       %转二值图像
figure,imshow(im,[]),title('BW');   %显示二值图像im2=imfill(im,'holes');             %填充
im3=bwperim(im2);                   %轮廓提取
figure,imshow(im2,[]); title('')             %显示
figure,imshow(im3,[]);

============================================================================================

============================================================================================

1、Matlab简述

Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言。有人称它为“第四代”计算机语言,它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化界面设计、便捷的与其它程序和语言接口的功能。随着Matlab语言功能越来越强大,不断适应新的要求并提出新的解决方法,可以预见,在科学运算,自动控制与科学绘图领域,Matlab语言将长期保持其独一无二的地位。

2、几种常用的边缘检测算子

边缘是图像的最重要的特征,。边缘是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。边缘检测主要是灰度变化的度量、检测和定位。有很多种不同的边缘检测方法,同一种方法使用的滤波器也不尽相同。图像边缘检测就是研究更好的边缘检测方法和检测算子。

边缘检测的基本思想首先是(1)利用边缘增强算子,突出图像中的局部边缘,(2)然后定义象素的“边缘强度”,通过设置阈值的方法提取边缘点集。由于噪声和模糊的存在,监测到的边界可能会变宽或在某点处发生间断。因此,边界检测包括两个基本内容:

i.         用边缘算子提取出反映灰度变化的边缘点集

ii.        在边缘点集合中剔除某些边界点或填补边界间断点,并将这些边缘连接成完整的线

常用的检测算子有微分算子、拉普拉斯高斯算子和canny算子。

在Matlab图像处理工具箱中,提供了edge函数利用以上算子来检测灰度图像的边缘。

2.1微分算子法

经典的边缘提取方法是考察图像的每个像素的某个邻域内灰度的变化,利用边缘邻近一阶或二阶方向导数变化规律,用简单的方法检测边缘,称为微分算子法

导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值较高,因此我们将图像的导数算子运算值作为相应的边界强度,所以可以通过对这些导数值设置阈值,提取边界的点集。

一阶导数是最简单的导数算子。已知在点f(x,y)处,梯度grad(F(x,y))的幅度为:

它们分别求出了灰度在x和y方向上的变化率,但是要对每一个像素进行以上的运算,运算量较大,所以在实际应用中常用小区域模板卷积运算来进行近似计算。模板运算的想法是将赋予某一个像素的值作为它本身灰度值和相邻象素灰度值的函数。运用中,对x,y方向各用一个模板。

2.1.1 Sobel算子

Sobel算子是滤波算子的形式来提取边缘。X,Y方向各用一个模板,两个模板组合起来构成1个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。

图1 Sobel算子模板

2.1.2 robert算子

Robert算子是一种梯度算子,它用交叉的差分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好:

模板如图:

图2 Robert算子模板

2.1.3 prewitt算子

prewitt算子是加权平均算子,对噪声有抑制作用,但是像素平均相当于对图像进行地同滤波,所以prewitt算子对边缘的定位不如robert算子。模板如图;

图3 prewitt算子模板

代码如下:

原始图像为三位编织复合材料二维截面图,对原始图像进行前期处理

i=imread('d1.jpg');

i2=im2double(i);

ihd=rgb2gray(i2);

[thr,sorh,keepapp]=ddencmp('den','wv',ihd);

ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);

figure,imshow(ixc),title('消噪后图像 ');

k2=medfilt2(ixc,[7 7]);

figure,imshow(k2),title('中值滤波');

isuo=imresize(k2,0.25,'bicubic');

%sobert、robert和prewitt算子检测图像边缘

esobel=edge(isuo,'sobel');

erob=edge(isuo,'roberts');

eprew=edge(isuo,'prewitt');

subplot(2,2,1);

imshow(isuo);title('前期处理图像');

subplot(2,2,2);

imshow(esobel);title('sobel算子提取');

subplot(2,2,3);

imshow(erob);title('roberts算子提取');

subplot(2,2,4);

imshow(eprew);title('prewitt算子提取');

图4 微分算子边缘检测结果

2.2 Laplacian算子
   拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉。前面介绍的几种梯度法具有方向性,不能对各种走向的边缘都具有相同的增强效果。但是Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

对一个连续函数,它在位置的拉普拉斯算子定义如下:

在图像边缘检测中,为了运算方便,函数的拉普拉斯高斯算子也是借助模板来实现的。其模板有一个基本要求:模板中心的系数为正,其余相邻系数为负,所有系数的和应该为零。

图5 Laplacian算子模板

2.3  Canny边缘检测法

Canny边缘检测是一种比较新的边缘检测算子,具有很好的边缘监测性能,在图像处理中得到了越来越广泛的应用。它依据图像边缘检测最优准则设计canny边缘检测算法:

(1)       首先用2D高斯滤波模板进行卷积以消除噪声

(2)       利用导数算子找到图像灰度地沿着两个方向的偏导数,并求出梯度的大小:  

(3)       利用(2)的结果计算出梯度的方向

(4)       一旦知道了边缘的方向,就可以把边缘的梯度方向大致分为四种:水平、竖直、45度方向、135度方向。通过梯度的方向,就可以找到这个像素梯度方向的邻接像素。

(5)       遍历图像,若某个像素的灰度值与其梯度方向上前后两个像素的灰度值相比不是最大的,那么这个像素值置为0,即不是边缘。

(6)       使用累计直方图计算两个阈值,大于高阈值的一定是边缘,小于低阈值的一定不是边缘,介于之间的,看这个像素的邻接像素中有没有超过高阈值的边缘像素,如果有的话那么它

就是边缘了,否则它就不是边缘。

调用Laplacian算子、canny算子检测法检测图像边缘的程序如下:

elog=edge(isuo,'log');

ecanny=edge(isuo,'canny');

subplot(1,2,1);

imshow(elog);title('log算子提取');

subplot(1,2,2);

imshow(ecanny);title('canny算子提取');

图6 canny算子、Laplacian算子检测结果

3.边缘检测结果比较

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

参考文献

[1] 赵春晖.现代图像处理技术及Matlab实现[M].北京:人民邮电出版社,2001.

[2] 阮秋琦.数字图像处理学[M].北京:电子工业出版社,2001.

[3] 何斌.数字图像处理[M].北京:人民邮电出版社,2001

I=imread('lena.bmp');%  提取图像

BW1=edge(I,'sobel'); %用SOBEL算子进行边缘检测

BW2=edge(I,'roberts');%用Roberts算子进行边缘检测

BW3=edge(I,'prewitt'); %用prewitt算子进行边缘检测

BW4=edge(I,'log'); %用log算子进行边缘检测

BW5=edge(I,'canny'); %用canny算子进行边缘检测

h=fspecial('gaussian’,5);

BW6=edge(I,’canny’);

subplot(2,3,1), imshow(BW1);

title(‘sobel edge check’);

subplot(2,3,2), imshow(BW2);

title(‘sobel edge check’);

subplot(2,3,3), imshow(BW3);

title(‘prewitt edge check’);

subplot(2,3,4), imshow(BW4);

title(‘log edge check’);

subplot(2,3,5), imshow(BW5);

title(‘canny edge check’);

subplot(2,3,6), imshow(BW6);

title(‘gasussian&canny edge check’);%此为用高斯滤波后Canny算子边缘检测结果

(注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)

============================================================================================

使用Matlab对二值图像进行轮廓提取相关推荐

  1. Matlab二值图像进行轮廓提取

    0 前言 本文主要总结一下在matlab中可用于进行轮廓提取的函数. 1 bwperim 根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下: %读取原图 im = i ...

  2. Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法

    Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 原文:Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法  [函数名称] 二值图像轮廓提取      ...

  3. 二值图像分析:二值图像轮廓提取

    二值图像分析:二值图像轮廓提取 1.OpenCV中的图像轮廓 2.轮廓提取相关API总结 2.1 轮廓发现findContours 2.2 轮廓绘制drawContours 2.3 轮廓外接矩形获取b ...

  4. 基于MATLAB的点云建筑物轮廓提取与基于平面探测法的点云建筑物提取

    博客中轮廓提取使用的点云数据 建筑物平面检测使用的点云数据 **两个小的点云处理实验项目,(源码资源****有常(注意目前是有常哦)私我vx:xdsqczkyqs713 ,第一个项目点云建筑物轮廓提取 ...

  5. matlab 图像 轮廓 填充颜色,基于Matlab的图形轮廓提取及填充

    计算机工程应用技术 本栏目责任编辑: 贾薇薇 电脑知识与技术 基于 Matlab 的图形轮廓提取及填充 井艾斌,柳青,孟祥增 (山东师范大学, 山东 济南 250014) 摘要: 提取图形的形状特征是 ...

  6. 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

    FindContours 在二值图像中寻找轮廓  int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...

  7. 基于MATLAB的图片中文字的提取及识别

    基于MATLAB的图片中文字的提取及识别 一.引言 随着计算机科学的飞速发展,以图像为主的多媒体信息迅速成为重要的信息传递媒介,在图像中,文字信息(如新闻标题等字幕) 包含了丰富的高层语义信息,提取出 ...

  8. Python-Opencv 形态学+算子实现轮廓提取

    1. 形态学 图像的形态学操作主要是腐蚀和膨胀,在原理上就是结构元和原图进行卷积操作,只不过原始卷积是进行计算,而腐蚀和膨胀是看结构元覆盖范围内1的情况. 1.1. 腐蚀与膨胀定义 腐蚀定义:若结构元 ...

  9. OpenCV实践之路——opencv玩数独之一九宫格轮廓提取与透视变换

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50783585 微博:http ...

最新文章

  1. dos配置java_windows dos命令配置JAVA环境变量
  2. SQL Server 2008编写脚本时智能提示功能丢失的处理
  3. matplotlib —— 添加文本信息(text)
  4. WordPress 多媒体库添加分类和标签支持
  5. 当选院士!兰州大学教授斩获美国该领域最高荣誉!
  6. python 程序运行计时 动态,在python中运行计时器几分钟
  7. 基本排序算法比较与选择
  8. ubuntu安装后要做什么
  9. sip协议详解(一)
  10. C语言全局变量重复定义检查-fno-common
  11. 【泛函】线性算子的谱论(数学知识用程序表达轻松学系列)
  12. stm32f407与计算机的usb通讯,STM32F407 USB通信程序 USB Device 虚拟串口 CDC类 Cubemx生成...
  13. 电商与ERP集成方案
  14. 使用Java生成思维导图
  15. CSS3火焰文字特效制作教程
  16. 【企业架构设计实战】2 业务架构设计
  17. 共享锁和排它锁(ReentrantReadWriteLock)
  18. AndroidJNI 函数介绍
  19. 初始化一个java空数组_Java 数组的两种初始化方式
  20. 如何在计算机上增加一个磁盘分区,win10系统额外新增加一个硬盘分区的详细办法...

热门文章

  1. Python实现随机游走详细解释
  2. openwrt设置语言的过程
  3. 微软word如何插入页码_如何在Microsoft Word中使用页码
  4. ARM简单程序设计【嵌入式系统】
  5. 丰沛数_不足数_完全数
  6. 【Python】字符串不足位数补零/补空格
  7. 词干抽取java实现_LinkedIn文本分析平台:主题挖掘的四大技术步骤
  8. 来自全网超火的Android面试笔记GitHub下载量过百万
  9. netty结合java_在SpringBoot中整合使用Netty框架的详细教程
  10. 在线直播系统源码,多图加载成动画的形式如何实现