寻找分水岭,canny边缘检测的matlab程序~

寻找分水岭,canny边缘检测的matlab程序~,第1张

以下是一段MATLAB程序,经运行没问题。有注释,有分水岭算法。

afm = imread('cameramantif');figure, imshow(afm);

se = strel('disk', 15);

Itop = imtophat(afm, se); % 高帽变换

Ibot = imbothat(afm, se); % 低帽变换

figure, imshow(Itop, []); % 高帽变换,体现原始图像的灰度峰值

figure, imshow(Ibot, []); % 低帽变换,体现原始图像的灰度谷值

Ienhance = imsubtract(imadd(Itop, afm), Ibot);% 高帽图像与低帽图像相减,增强图像

figure, imshow(Ienhance);

Iec = imcomplement(Ienhance); % 进一步增强图像

Iemin = imextendedmin(Iec, 20); figure,imshow(Iemin) % 搜索Iec中的谷值

Iimpose = imimposemin(Iec, Iemin);

wat = watershed(Iimpose); % 分水岭分割

rgb = label2rgb(wat); figure, imshow(rgb); % 用不同的颜色表示分割出的不同区域

常见的边缘检测算子有Roberts算子、Prewitt算子、Sobel算子、Marr-Hidreth边缘检测以及canny算子等。

一、利用梯度进行边缘检测

1、Roberts算子采用对角线方向相邻两像素之差近似的梯度幅值来检测边缘。该算子定位较准确,但对噪声比较敏感,检测水平和竖直边缘效果好于斜向边缘。

2、Sobel算子根据图像的像素点上下、左右邻点灰度加权差在边缘处达到极值这一特点来检测边缘。该算子对噪声有较好的平滑作用,能提供建准确的边缘方向信息,但是边缘定位精度不高。

3、Prewitt算子边缘检测的思路与Sobel算子类似,也是在一个掩模中定义微分运算。算子对噪声具有平滑作用,同样定位精度不够高。

二、更为先进的边缘检测技术

1、Marr-Hildreth算法(拉普拉斯算子)

(1)采用高斯低通滤波器对图像进行滤波;

(2)采用拉普拉斯模板对进行卷积;

(3)找到步骤(2)所得图像的零交叉。

该算子是二阶微分算子,利用边缘点处二阶导函数出现零交叉原理来检测图像的边缘。对灰度突变及噪声较敏感,不具有方向性,不能获得图像边缘的方向信息。

2、Canny算子

Canny边缘检测算法步骤:

(1)用一个高斯滤波器平滑输入图像

(2)计算梯度幅值图像和角度图像

(3)对梯度幅值图像进行非最大抑制

(4)用双阈值处理和连接分析来检测并连接边缘

Canny算子是上述中效果最好的算子,该算子去噪能力强,在连续性、细度和笔直度等线的质量方面也很出众。但是Canny算子的性能带来的问题是:连接起来更复杂、执行时间较长。

综上所述,在实际工业生产中,要求实时性较高的情况下,通常采用阈值梯度的方法;当对质量要求较高时,可选择更为先进的方法,尤其是Canny算子。

先看高级版的python3的canny的自适应边缘检测:

内容:

1 canny的边缘检测的介绍。

2 三种方法的canny的边缘检测,由浅入深地介绍:固定值的静态,可自调节的,自适应的。

说明:

1 环境:python38、opencv453和matplotlib343。

2 :来自品阅网正版免费图库。

3 实现自适应阈值的canny边缘检测的参考代码和文章:

上述的代码,本机均有报错,故对代码进行修改,注释和运行。

初级canny:

1 介绍:opencv中给出了canny边缘检测的接口,直接调用:

即可得到边缘检测的结果ret,其中,t1,t2是需要人为设置的阈值。

2 python的opencv的一行代码即可实现边缘检测。

3 Canny函数及使用:

4 Canny边缘检测流程:

去噪 --> 梯度 --> 非极大值抑制 --> 滞后阈值

5 代码:

6 *** 作和过程:

7 原图:

8 疑问:

ret = cv2canny(img,t1,t2),其中,t1,t2是需要人为设置的阈值,一般人怎么知道具体数值是多少,才是最佳的呀?所以,这是它的缺点。

中级canny:

1 中级canny,就是可调节的阈值,找到最佳的canny边缘检测效果。

2 采用cv2createTrackbar来调节阈值。

3 代码:

4 *** 作和效果:

5 原图:

高级canny:

1 自适应canny的算法:

ret = cv2canny(img,t1,t2)

即算法在运行过程中能够自适应地找到较佳的分割阈值t1,t2。

2 文件结构:

3 mainpy代码:

4 dogpy代码:

5 bilateralfiltpy代码:

6 原图:

7 效果图:本文第一个gif图,此处省略。

小结:

1 本文由浅入深,总结的很好,适合收藏。

2 对于理解python的opencv的canny的边缘检测,很有帮助。

3 本文高级版canny自适应的算法参考2篇文章,虽然我进行代码的删除,注释,修改,优化等 *** 作,故我不标注原创,对原作者表达敬意。

4 自己总结和整理,分享出来,希望对大家有帮助。

可以明显的看出matlab的边缘更为细腻。

首先回顾一下传统的canny算法的主要步骤:

1、使用sobel差分算子求出灰度图像的x和y方向导数;

2、求出图像各点梯度大小及其方向;

3、设置高低两个阈值,梯度大于高阈值为强边像素点,大于低阈值为潜在可能是较弱的边缘点;

4、在经过一次筛选剩下的强边缘点中沿着梯度方向进行非极大值抑制;

5、顺着二次筛选后的强边点寻找邻近的弱边点得到最终的边缘。

opencv和matlab都基本按照以上步骤得到各自的canny 函数,但一般来说处理之前都先对图像进行模糊平滑,这样得到的效果更好。opencv更注重实时性,所以连平滑都作为可选项放在函数外,而matlab则 更注重质量,除了加入平滑 *** 作外,还有其他一系列的优化 *** 作,以下逐项比较。

1、模糊平滑

这一项其实对生成的边缘效果影响十分大,平滑的越流畅则生成的边缘越圆滑,一 般使用高斯低通滤波;那么滤波器的大小以及高斯分布的方差是两个关键的参数,通过实验确定取什么值最优,但一般用5×5和方差为2的就可以 了,opencv的cvSmooth函数可以进行平滑,一般都是使用输入和输出都是8位深的图像,而matlab是把图像转换为浮点类型后进行平滑 *** 作, 这样一来从精度上说matlab就已经更胜一筹了,因为这直接决定后面的求导运算得到的两个方向导数的精度。

2、梯度

在sobel的运用上两者是一致的,但是求梯度的方向的算法两者是截然不同 的,但本质一样,效果经过笔者测试基本相同。在梯度的大小方面,opencv提供了欧式距离和哈密顿距离两种度量方式,前者是平方和后开方,后者是直接绝 对值的加和,opencv默认使用后者,我们知道((x2+y2)/2)1/2>=(|x|+|y|)/2,以及|x|+|y|>=(x2+y2)1/2 所以理论上使用哈密顿距离也基本符合真实数值,但总归是有精度上的差别,这也是为什么有人说opencv的canny不如matlab好的第二个原因了,在cvh里面可以通过修改CV_CANNY_L2_GRADIENT来进行切换。

3、阈值

这里的阈值是梯度大小是否能够通过的开关,opencv的阈值都采用手工设置的方式,而matlab是把所有点的强度作出直方图,保留一定百分比的强边缘,这个步骤的差别不会影响结果的质量,但是在速度上当然会有差别,这是速度和方便程度的矛盾。

4、薄边效果

经过非极大值抑制后的边缘基本上是一到两个像素点的宽度,最终希望得到一个线 宽的边缘,opencv只是通过简单的判断来防止并行或者并列出现两个强边像素,这种简单的薄边手法会导致边缘的断裂,而matlab采用了Louisa Lam, Seong-Whan Lee, and Ching Y Wuen, "Thinning Methodologies-A Comprehensive Survey," IEEE TrPAMI, vol 14, no 9, pp 869-885, 1992 这边文章的方法进行两次薄边处理,效果相当好,所得的边缘十分圆滑。

综上所述,要想opencv的效果和matlab的差不多就必须在平 滑上下功夫,梯度的大小要用欧式距离度量,另外要加入matlab的薄边算法,这样一来处理时间大概会增加一倍,但也基本可以满足实时处理。另外在一般视 觉应用中可以把算法修改为一个阈值,去掉强弱边连接这一步骤以提高速度

以上就是关于寻找分水岭,canny边缘检测的matlab程序~全部的内容,包括:寻找分水岭,canny边缘检测的matlab程序~、怎样理解微分算子可以检测图像的边界、3种python3的canny边缘检测之静态,可调节和自适应等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9839059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存