拉普拉斯-Laplacian
程序员文章站
2024-01-22 21:44:58
...
使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的,拉普拉斯算子如下图所示:
Mat image = imread("test.jpg", 1);
imshow("原图像", image);
Mat imageEnhance;
Mat kernel = (Mat_<uchar>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
filter2D(image, imageEnhance, CV_8UC3, kernel);
imshow("拉普拉斯算子增强效果", imageEnhance);
拉普拉斯算子还可以表示成模板的形式
Mat image = imread("test.jpg");
imshow("image", image);
Mat kernel = (Mat_<uchar>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);
//0, 1, 0, 1, -4, 1, 0, 1, 0
//0, -1, 0, -1, 4, -1, 0, -1, 0
//-1, 1, -1, 1, 8, -1, -1, 1, -1
Mat matlaplacian;
filter2D(image, matlaplacian, CV_8UC3, kernel);
imshow("matlaplacian", matlaplacian);
参考:https://blog.csdn.net/li_wen01/article/details/72864291
Sobel 算子 ,其基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,你会看到极值的出现。正如下图所示:
如果在边缘部分求二阶导数会出现什么情况?
你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点
Laplacian 算子
- 从以上分析中,我们推论二阶导数可以用来 检测边缘 。 因为图像是 “2维”, 我们需要在两个方向求导。使用Laplacian算子将会使求导过程变得简单。
- Laplacian 算子 的定义:
- OpenCV函数 Laplacian 实现了Laplacian算子。 实际上,由于 Laplacian使用了图像梯度,它内部调用了 Sobel 算子。
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); 函数接受了以下参数: src_gray: 输入图像。 dst: 输出图像 ddepth: 输出图像的深度。 因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。 kernel_size: 内部调用的 Sobel算子的内核大小,此例中设置为3。 scale, delta 和 BORDER_DEFAULT: 使用默认值
Mat image = imread("test.jpg", 1);
imshow("原图像", image);
/// 使用高斯滤波消除噪声
GaussianBlur(image, image, Size(3, 3), 0, 0, BORDER_DEFAULT);
/// 使用Laplace函数
Mat imageEnhance;
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_32FC3;
Laplacian(image, imageEnhance, ddepth, kernel_size, scale, delta, BORDER_DEFAULT);
Mat abs_dst;
convertScaleAbs(imageEnhance, abs_dst);
imshow("拉普拉斯算子增强效果", imageEnhance);
Mat src, src_gray, dst;
/// 装载图像
src = imread("test.jpg", 1);
imshow("原图", src);
/// 使用高斯滤波消除噪声
GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
/// 转换为灰度图
cvtColor(src, src_gray, CV_RGB2GRAY);
/// 使用Laplace函数
Mat abs_dst;
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
char* window_name = "Laplace Demo";
Laplacian(src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT);
convertScaleAbs(dst, abs_dst);
/// 显示结果
imshow(window_name, abs_dst);
参考:
https://blog.csdn.net/dcrmg/article/details/53677739
https://blog.csdn.net/iefenghao/article/details/84843318##
推荐阅读
-
在OpenCV里实现高斯拉普拉斯变换
-
拉普拉斯-Laplacian
-
傅里叶变换和拉普拉斯变换
-
朴素贝叶斯(Naive Bayes)原理+编程实现拉普拉斯修正的朴素贝叶斯分类器
-
Inverse Geometric Transform; Gaussian and Laplacian Pyramid; Canny Filter; Harris Detection从零实现
-
OpenCV图像处理教程C++(十五)边缘检测算法--sobel算子、拉普拉斯算子、Canny算子
-
【OpenCV】边缘检测:Sobel、拉普拉斯算子
-
python—opencv图像膨胀|图像腐蚀|图像边缘检测sobel算子/拉普拉斯算子/canny算子
-
Opencv图像处理——边缘处理Sobel、拉普拉斯算子
-
【OpenCV3经典编程100例】(08)边缘检测:拉普拉斯算子Laplacian()