- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一种彩色图像的边缘检测方法及实现
摘要:在数字图像处理的研究和应用中,人们往往仅对图像中的某些部分感兴趣,这些感兴趣的部分常称为目标或对象(ROI),它们一般对应图像中特定的,具有独特性质的区域。图像处理的重要任务就是对图像进行分析和理解,该文讲述了图像边缘检测和边缘跟踪的原由,归纳出了几种图像边缘检测的算子,最后介绍了一种基于RGB分量直接梯度法的彩色图像图像边缘检测方法以及该方法的C#实现。
关键词:边缘检测;数学算子;C#
中图分类号:TP18文献标识码:A文章编号:1009-3044(2010)20-5579-03
1 灰度图像的边缘检测
图像的边缘是图像的最基本特征。所谓边缘是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合,是图像中灰度发生急剧变化的区域。图像灰度的变化可以用图像的梯度反映,边缘检测就是求连续图像f(x,y)梯度的局部最大值和方向。
f(x,y)沿r的梯度为:
(1)
使最大的条件是:
(2)
梯度最大值及其方向由(1)、(2)式求得:
梯度最大值:
在离散情况下常用梯度算子来检测边缘,给定图像f(m,n)在两个正交方向H1和H2上的梯度φ1(m,n)和φ2(m,n)如下:
边缘的强度和方向由下式给出:
常用边缘检测算子有Roberts算子、Prewitt算子和Sobel算子等。
Roberts算子的卷积模板是:
Prewitt算子的卷积模板是:
Sobel算子的卷积模板是:
Roberts算子特点是边缘定位准,但对噪声敏感;Sobel算子的两个模板能够最好地响应图像的垂直边缘和水平边缘,因此能够取得比较好的效果。
另外有一种二阶导数算子拉普拉斯算子(Laplacian)也借助模板来实现,其模板定义有一个基本要求:模板中心的系数为正数,其余相邻系数为负数,所有系数的和应该为零。常用形式如下:
Laplacian算子在检测到图像强边缘的同时也可以检测到弱边缘,对噪声比较敏感,容易对ROI造成干扰。
2 彩色图像的边缘检测
彩色图像的边缘检测比灰度图像复杂,因为它不仅要考虑亮度,还要考虑不同的颜色,,这种图像以R(红)、G(绿)、B(蓝)三基色的亮度为一组,代表每个像素在色彩空间的颜色。与索引图像不同,RGB图像的各象素的亮度值直接存在图像数组中,
图像数组的维数:m,z3,m、,z表示图像像素的长、宽。
传统的梯度边缘提取通常是对单一的灰度图进行处理,不能直接对彩色位图图像操作,通常的做法是在先将彩色图像转化成灰度图,然后再进行边缘提取。这样做的后果是丧失原图像中的一些边缘信息,通常提取出来的边缘不连续,还需进行边界跟踪和插值连接。
另一种做法是,先将位图图像投影分解3幅伪彩色图:R灰度图、G灰度图、B灰度图,对每一幅图像都可用梯度法将边缘提取出来,得到Gr、Gg、Gb 三幅梯度图像,由于图像易受环境干扰、背景照明不均,这样提取出来的3种图像边缘不一致。对此可做这样的处理:将每一幅梯度图表示出的边缘综合起来,然后再取适当的阈值门限T,直接将彩色图像二值化就可得到很好效果的边缘。其数学描述如下:
(3)
对公式选定门限T,最后得:
这种方法的优点是:1)直接对彩色图像处理,避免了先将彩色图像转化为灰度图,再处理所造成的信息丢失。2)由于采用了同一像素多个梯度求和算法,忽略了环境干扰对边缘提取的影响,能得到较好的边缘的特征。
对三种颜色分量采用Sobel算子进行灰度边缘检测后,通过人为选择阈值的方法生成二值边缘图像的C#实现关键代码如下:
private void edgeC_Click(object sender, EventArgs e)
{ if (Btmap != null)
{ edgeColor edgedetC = new edgeColor();
if (edgedetC.ShowDialog() == DialogResult.OK)
{ Rectangle rect = new Rectangle(0, 0, Btmap.Width, Btmap.Height);
System.Drawing.Imaging.BitmapData bmpData = Btmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, Btmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Btmap.Width * Btmap.Height;
文档评论(0)