Laplace 算子
目标
- 使用OpenCV函数cv :: Laplacian来实现Laplace运算符的离散模拟。
理论
- 在上一个教程中,我们学习了如何使用Sobel操作符。这是基于以下事实:在边缘区域中,像素强度显示“跳跃”或强度的高变化。得到强度的一阶导数,我们观察到边缘的特征是最大值,如图所示:
- 和...如果我们采取二阶导数会发生什么?
您可以观察到二阶导数为零!因此,我们也可以使用此标准来尝试检测图像中的边缘。然而,请注意,零不仅会出现在边缘(它们实际上可以出现在其他无意义的位置); 这可以通过在需要时应用过滤来解决。
Laplace Operator
- 从上面的解释,我们推导出二阶导数可以用来检测边缘。由于图像是“* 2D *”,所以我们需要在两个维度上使用导数。在这里,Laplace Operator很方便。
- Laplace Operator被定义为:
- 拉普拉斯运算符通过函数cv :: Laplacian在OpenCV中实现。事实上,由于拉普拉斯算子使用图像的梯度,所以它在内部调用Sobel算子来执行其计算。
Code
- 这个程序是做什么的?
- 加载图像
- 用高斯模糊来消除噪点
- 将原始图像转换为灰度
- 将Laplace Operator应用于灰度图像
- 在窗口中显示结果
- 代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src = imread("C:/usr/opencv-test/Testpictures/sight.jpg"); // by default
Mat edge_image, gray_src,dst;
if (src.empty())
{
printf("image load failed!\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
GaussianBlur(src, dst, Size(3, 3), 0, 0); //高斯模糊,去噪,使平滑
cvtColor(dst, gray_src, CV_BGR2GRAY); //转为灰度
// Laplacian算子
Laplacian(gray_src, edge_image, CV_16S, 3);
convertScaleAbs(edge_image, edge_image);
imshow("edge_image", edge_image);
//imshow("output image", gray_src);
waitKey(0);
return 0;
}
结果
- 在编译上面的代码之后,我们可以运行它作为参数作为图像的路径。例如,使用作为输入:
- 我们得到以下结果: