我是靠谱客的博主 背后导师,最近开发中收集的这篇文章主要介绍opencv-第六章-拉普拉斯变换和canny算子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

opencv-第六章-拉普拉斯变换和canny算子

opencv的拉普拉斯函数实现了拉普拉斯算子的离散模拟。因为拉普拉斯算子可以用二次导数的形式定义,可假设其离散实现类似于二阶sobel导数。事实的确如此,opencv在计算拉普拉斯算子时直接使用sobel算子。


void cvLaplace(const CvArr* src, CvArr* dst, int apertureSize=3);

cvLaplace函数通常把源图像和目标图像以及中孔大小作为变量。源图像既可以是8位(无符号)图像,也可以是32位(浮点)图像。而目标图像必须是16位(有符号)或者32位(浮点)图像。这里的中孔与sobel导数中出现的中孔完全一样,事实上主要给出区域大小,在二次求导的计算中,采样这个区域的像素。


拉普拉斯算子可用于各种情况。一个通常的应用是检测“团块”。联想到拉普拉斯算子的形式是沿着x轴和y轴的二次导数的和,这就意味着周围是更高值的单点或者小块(比中孔小)会将使这个函数值最大化。反过来说,周围是更低值的点将会使函数的负值最大化。


基于这种思想,拉普拉斯算子也可以用作边缘检测。为达此目的,只需要考虑当函数快速变化时其一阶导数变大即可。同样重要的是,当我们逼近类似边缘的不连续地方时导数会快速增长,而穿过这些不连续地方时导数又会快速减小。所以导数会在此范围内有局部极值。这样我们可以期待局部最大值位于二阶导数为0的地方。

原始图像的边缘位于拉普拉斯的值等于0的地方。不幸的是,在拉普拉斯算子中,所有实质性的和没有意义的边缘的检测都是0.但这并不是什么问题,因为我们可以过滤掉这些点,它们的一阶(sobel)导数值也很大。


canny算子

canny边缘检测法把以上的描述完善了。首先在x和y方向求一阶导数,然后组合为4个方向的导数。这些方向导数达到局部最大值的点就是组成边缘的候选点。

然而,canny算法最重要的一个新特点是试图将独立边的候选像素拼接成轮廓。轮廓的形成是对这些像素运用滞后性阈值。这意味着有两个阈值,上限和下限。如果一个像素的梯度大于上限阈值,则被认为是边缘像素,如果低于下限阈值,则被抛弃,如果介于二者之间,只有当其与高于上限阈值的像素连接时才会被接受。canny推荐的上下限阈值比为2:1到3:1之间。


void cvCanny(const CvArr* img, CvArr* edges, double lowThresh, 

double highThresh, int apertureSize=3);

cvCanny函数需要输入一幅灰度图,输出图也一定是灰度的(实际上是布尔图像)。接下来两个参数是下限阈值与上限阈值,最后一个参数是另一个中孔。通常,这个被sobel算子用到的中孔是cvCanny在内部使用的。





最后

以上就是背后导师为你收集整理的opencv-第六章-拉普拉斯变换和canny算子的全部内容,希望文章能够帮你解决opencv-第六章-拉普拉斯变换和canny算子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部