边缘检测是一种寻找图像边界的图像处理技术。这里,我们将介绍在边缘检测方法中相当流行的拉普拉斯方法。
如果您是OpenCV的新手,请参阅以下文档了解所需的安装。我们不会使用拉普拉斯方法的OpenCV内置函数来更好地理解此方法。
为什么我们要用拉普拉斯方法呢?
当涉及到图像时,有斜坡边缘、台阶边缘,如下图所示。
阶跃边缘很容易识别,我们可以使用一个简单的过滤式的逐次差分算子,它只进行一次导数,就可以得到像素颜色等级的变化率。
当涉及到斜坡边缘时,使用相邻像素的颜色值的差异来识别并不容易。所以我们必须找到二阶导数来识别这些边。这里我们得到颜色等级的“变化率变化率”。
在这里,我们在上面的图片中圈出,它是负的,零,正的或正的,零,负的。所以我们可以很容易地辨认出这些边缘。当我们使用二阶导数时。
对于拉普拉斯过滤,我们要做的是找出关于x和y的二阶导数。
最终,我们可以得出如下指标。
拉普拉斯函数对噪声高度敏感,所以当我们应用这个拉普拉斯过滤时。如果我们能降低噪音就更好了,我们可以利用过零特性来避免这些问题。
当涉及到高斯的拉普拉斯算子时,它是一个结合了拉普拉斯算子和高斯算子的算子,这里将首先进行高斯平滑,然后再计算拉普拉斯算子
通过应用下面的5乘5卷积核,我们可以得到高斯的拉普拉斯函数的结果。
现在让我们看看使用这些矩阵进行边缘检测的实际示例。
请参考代码
代码说明
Mat img = imread(argv[1], 1);
在这里,我们读取图像并获得相关数据,如图像的高度和宽度。在if中,条件用于在图像不存在时发出消息。
然后我们创建灰度图像GR、GR2
Mat output = gr.clone();
这里创建图像以显示输出。
for (int i = 1; i < height - 1; i++) {
在这里,循环像素以应用Laplacian,并对正交像素应用Laplacian(Sum 2),然后将Laplacian应用于考虑正交和对角像素(Sum)
在cv::saturate_cast
我们所做的是将数据正常化。在这里,当我们像下面这样直接赋值时
output.at(y,x)=sum;
那么就会有具有以下属性的值
255+255+255+255-4*0=1020
0+0+0+0-4*255=-1020
为了使这些值在0到255之间标准化,我们使用saturate_cast。
#gray picture without laplacian
namedWindow("Gray Image");
imshow("Gray Image", gr);
在这里,使用上面的代码,我们已经显示并保存了生成的图像。
输出图像
高斯的拉普拉斯式
int sum3 = 0;
在这里,我们从值2的“i”和“j”开始,以避免当值超出界限时发生的错误。
输出图像
结论
在这里,你可以看到,高斯的拉普拉斯,也被称为墨西哥帽子核的使用,可以比其他两个核更好地检测边缘。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/08/10/%e4%b8%8d%e4%bd%bf%e7%94%a8opencv%e6%8b%89%e6%99%ae%e6%8b%89%e6%96%af%e5%86%85%e5%bb%ba%e5%87%bd%e6%95%b0%e7%9a%84%e6%8b%89%e6%99%ae%e6%8b%89%e6%96%af%e7%ae%97%e5%ad%90%e8%be%b9%e7%bc%98%e6%a3%80/