1. 磐创AI首页
  2. Medium

不使用OpenCV拉普拉斯内建函数的拉普拉斯算子边缘检测。

边缘检测是一种寻找图像边界的图像处理技术。这里,我们将介绍在边缘检测方法中相当流行的拉普拉斯方法。

如果您是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中(Sum);

我们所做的是将数据正常化。在这里,当我们像下面这样直接赋值时

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/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息