欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

拉普拉斯-Laplacian

程序员文章站 2024-01-22 21:44:58
...

使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的,拉普拉斯算子如下图所示:

拉普拉斯-Laplacian

	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);

拉普拉斯-Laplacian 拉普拉斯算子还可以表示成模板的形式 

拉普拉斯-Laplacian

	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);

拉普拉斯-Laplacian

 

 参考:https://blog.csdn.net/li_wen01/article/details/72864291

Sobel 算子 ,其基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,你会看到极值的出现。正如下图所示:

拉普拉斯-Laplacian

 如果在边缘部分求二阶导数会出现什么情况?

拉普拉斯-Laplacian

 你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点

 Laplacian 算子

  1. 从以上分析中,我们推论二阶导数可以用来 检测边缘 。 因为图像是 “2维”, 我们需要在两个方向求导。使用Laplacian算子将会使求导过程变得简单。
  2. Laplacian 算子 的定义:

    拉普拉斯-Laplacian

  3. 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);

 

拉普拉斯-Laplacian

	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);

拉普拉斯-Laplacian

 参考:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.html

https://blog.csdn.net/dcrmg/article/details/53677739 

https://blog.csdn.net/iefenghao/article/details/84843318##