引言:
图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈.边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。
前面已经介绍了Sobel算子,接下来介绍Laplacian算子与边缘检测。
Laplacian算子:
在一个二维函数f(x,y)中,x,y两个方向的二阶差分分别为,
所以Laplace算子的差分形式为,
写成filter mask的形式如下:
API介绍:
代码示例:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("F:\\visual studio\\Image\\building2.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
imshow("src", src);
//边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,
//因此必须采用滤波器来改善与噪声有关的边缘检测器的性能
Mat blursrc;
GaussianBlur(src, blursrc, Size(3, 3), 0, 0);
//转化为灰度图
Mat graysrc;
cvtColor(blursrc, graysrc, cv::COLOR_BGR2GRAY);
imshow("graysrc", graysrc);
//Laplace变换
Mat dst;
Laplacian(graysrc, dst, CV_16S, 3);
convertScaleAbs(dst, dst);
imshow("edge", dst);
waitKey(0);
}
疑问::
根据拉普拉斯算子的定义,在图像边缘处二阶导应该为0,在图像中应显示黑色,在过零点附近的波峰波谷应该显示为白色,所以我们得到的边缘实际上是 白黑白 相间的? 中间的黑色才是确切的边缘位置??
解答:
白色其实显示的边缘周围的极值点,但是几乎都是围绕在边缘周围。