作用原理:
拉普拉斯算子可以用于边缘检测,同时该算子不具有方向性,可以同时检测到 X 方向和 Y 方向的边缘,综合后检测出图像的边缘。
即拉普拉斯算子是 各向同性 的,这在很多情况下是一个优点,因为我们一般来说会同时关注 X 方向和 Y 方向的边缘,所以这时候就不需要做两次,一次边缘检测就能得到结果。
这里要注意的是,拉普拉斯算子是一种 二阶导数 算子,所以对噪声很敏感,在实际运用中通常会搭配高斯滤波一起用。
公式:
函数原型:
void cv::Laplacian ( InputArray src,
OutputArray dst,
int ddepth,
int ksize = 1,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
)
解析:
- src:输入图像
- dst:输出图像(尺寸和通道数与输入一致)
- ddepth:目标数据类型(位深,比如 CV_32F)
- ksize:用于计算滤波器二阶导数的孔径尺寸(必须是正奇数)
- scale:计算所得拉普拉斯值的缩放因子(可选,默认没有缩放)
- delta:对计算结果整体做一个正向偏移(可选,默认没有偏移)
- borderType:边界外推方法
注: 当 ksize=1 时,拉普拉斯算子滤波器为 3X3 的孔径,如下:
后三个参数一般选择默认值
代码示例:
void TestLaplacian()
{
cv::Mat lena = cv::imread("lena.jpg", 1);
cv::Mat blured;
cv::Mat result_1;
cv::Mat result_2;
cv::GaussianBlur(lena, blured, cv::Size(5, 5), 0, 0);
cv::Laplacian(lena, result_1, CV_32F);
cv::Laplacian(blured, result_2, CV_32F);
cv::imshow("lena", lena);
cv::imshow("result_1", result_1);
cv::imshow("result_2", result_2);
cv::waitKey(0);
return;
}
原图:
单独使用拉普拉斯算子进行边缘检测:
先用高斯滤波,再用拉普拉斯算子进行边缘检测:
可以看到,搭配使用后效果更佳