十七、拉普拉斯算子
1、理论
- 在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。
- 不用考虑二阶导数,拉普拉斯算子已经为我们提供了拉普拉斯算子。
2、处理流程
- 高斯模糊—去噪声
GaussianBlur
- 转换为灰度图像
cvtColor
- 拉普拉斯—二阶导数计算
Laplacian
- 取绝对值
convertScaleAbs
- 二值化—
threshold
(加上二值化增强显示效果) - 显示结果
3、API
Laplacian
Laplacian(
Mat gray_src,//灰度图像
Mat edge_image,//边缘图像
CV_16S,//位图深度
ksize = 3,//模板尺寸
)
示例代码:(拉普拉斯算子提取边缘,二值化)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char* argv) {
Mat src, dst;
src = imread("C:\\Users\\26839\\Pictures\\测试.png");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "Laplacian Result";
namedWindow(INPUT_WIN, WINDOW_AUTOSIZE);
namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
Mat gray_src, edge_image;
GaussianBlur(src, dst, Size(3, 3), 0, 0);//高斯模糊
cvtColor(dst, gray_src, COLOR_BGR2GRAY);//转灰度
Laplacian(src, edge_image, CV_16S, 3);//拉普拉斯求二阶导
convertScaleAbs(edge_image, edge_image);//取绝对值
threshold(edge_image, edge_image, 0, 255, THRESH_OTSU | THRESH_BINARY);//自适应阈值,取二值化图像
imshow(OUTPUT_WIN, edge_image);
waitKey(0);
return 0;
}
输出结果显示:
拉普拉斯提取边缘
二值化结果