什么是边缘检测
边缘检测是图像处理与计算机视觉中最重要的技术之一,其目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测对于分析图像中的内容、实现图像中物体的分割、定位等具有重要的作用。边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性。
边缘检测算子是利用图像边缘的突变性质来检测边缘的,通常情况下边缘检测有以下三种类型。
一阶微分:以一阶微分为基础的边缘检测,通过计算图像的梯度值来检测图像边缘,如Sobel算子,Prewitt算子,Roberts算子及差分边缘检测。
二阶微分:以二阶微分为基础的边缘检测,通过寻求二阶导数中的过零点来检测边缘,如拉普拉斯算子,高拉普拉斯算子,Canny算子边缘检测。
混合一阶微分和二阶微分:以混合一阶微分和二阶微分为基础的边缘检测,综合利用一阶微分和二阶微分的特征,如Marr-Hildreth边缘检测算子。
什么是 Laplace 算子
Q:什么是Laplace 算子?
A:Laplace 算子是最简单的各向同性二阶微分算子,具有旋转不变性,根据函数微分特性,该像素点值的二阶微分为零的点为边缘点。对于图像中灰度变化剧烈的区域,拉普拉斯算子能实现其边缘检测。拉普拉斯算子利用二阶微分特性与峰值间的过零点来确定边缘的位置,对奇异点或者边界点更为敏感,因此常用于图像锐化处理中。
图像的锐化操作的主要目的是突出图像的细节或者增强被模糊的图像细节,可实现灰度反差增强,同时使图像变得清晰。微分运算可以实现图像细节的突出,积分运算或加权平均可使图像变模糊。
对于原始图像f(x,y),锐化操作可以通过拉普拉斯算子对源图像进行处理,进行微分运算操作后产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加进而产生锐化图像。
拉普拉斯边缘检测算子和 Sobel 算子 Prewitt 算子不同,没有对图像进行平滑处理,所以会对噪声产生较大的相应,会将噪声作为边缘,得不到有方向的边缘,由于拉普拉斯算子只有一个卷聚合,所以计算成本比其他算子要低很多。
参考代码
对于拉普拉斯边缘检测算子,OpenCV
提供了库函数:
void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize = 1, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT);
其中,src代表输入图像,dst表示输出图像,ddepth代表输出图像的数据类型(位深),ksize代表拉普拉斯核的类型,scale代表比例系数,delta代表平移系数,borderType代表边界扩充类型。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; int main() { cv::Mat srcImage = cv::imread("C:\\Users\\86173\\Desktop\\cc.png"); if (!srcImage.data) return 1; cv::imshow("原图", srcImage); cv::Mat resultImage; //高斯平滑 cv::GaussianBlur(srcImage, srcImage, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT); //拉普拉斯变换 cv::Laplacian(srcImage, resultImage, CV_16S, 3); cv::convertScaleAbs(resultImage, resultImage); cv::imshow("拉普拉斯", resultImage); cv::waitKey(); return 0; }