前言
在上一章中描述了Sobel边缘检测算子,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/82286161)
目标
本章中,将学习:
- Laplance算子理论
- 相关API
- 代码演示
Laplance算子理论
-
理论:在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。
拉普拉斯算子理论.png
对应的算子梯度如下:
拉普拉斯梯度.png
还是上面这个图像,我们求一阶导数之后,还能求其二级导数。这个时候,当初图像上变化最大的位置,二阶导数为0,首先我们看一下离散的一阶导数的计算方法:
一阶导数.png
再对一阶导数求导得出二阶导数:
二阶导数.png
因为图像有行列两个方向,所以要两个方向分别求导数:
梯度.png
拉普拉斯算子由OpenCV函数cv::Laplacian实现。实际上,由于拉普拉斯算子使用图像的梯度,因此它在内部调用Sobel算子来执行其计算。 - 处理流程
1.高斯模糊 - 去噪声GaussianBlur()
2.转换为灰度图像cvtColor()
3.拉普拉斯 - 二阶导数计算Laplacian()
4.取绝对值convertScaleAbs()
5.显示结果
相关API
void Laplacian(
InputArray src,
OutputArray dst,
int ddepth,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
);
- InputArray类型的src ,输入图像。
- OutputArray类型的dst ,输出图像,图像的大小、通道数和输入图像相同。
- int类型的ddepth,目标图像的所需深度。
- int类型的ksize,用于计算二阶导数滤波器的孔径大小。大小必须是正数和奇数。
- double类型的scale,计算拉普拉斯值的可选比例因子。默认情况下,不应用缩放。
- double类型的delta,在将筛选的像素存储到dst中之前添加到这些像素的可选值。说的有点专业了其实就是给所选的像素值添加一个值delta。
- int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
代码演示
int main(int argc, char** argv) {
Mat src, dst;
src = imread(STRPAHT2);
if (!src.data) {
printf("could not load image");
}
//降噪
Mat gray_src, edge_image;
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);
//二值化
threshold(edge_image, edge_image, 0, 255, THRESH_OTSU | THRESH_BINARY);
imshow("Laplaiance", edge_image);
waitKey(0);
return 0;
}
效果图.png
网友评论