Laplace 算子-边界检测
原理
- 当一个图像在像素值变化大的地方(比如边界),对其取 first derivative ,得到:
取 second derivative 得到 :
变化最大的地方,一阶导数最大,二阶导数为0,前者是Sobel算子所为,后者便是 Laplace 算子所为
- 公式
因为图像是2D的,所以对两个方向求二阶导数:
例子
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src, src_gray,dst;
int kernel_size = 3;
int scale = 1;
int delta =0;
int ddepth =CV_16S;
const char* imageName = argc >2 ? argv[1] : "../res/beauty.jpg";
src =imread(imageName,IMREAD_COLOR);
if(src.empty())
{
cout << "can't load the image" << endl;
}
GaussianBlur(src,src,Size(3,3),0,0); //先滤波,将噪声去掉
cvtColor(src,src_gray,COLOR_BGR2GRAY);//转化成灰度图
Mat abs_dst;
Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta); //进行Laplace运算
convertScaleAbs(dst,abs_dst); //取绝对值->8bit
imshow("Laplace Demo",abs_dst);
waitKey(0);
return 0;
};
结果:
OpenCV API
内部调用的还是Sobel
void cv::Laplacian
(
InputArray src, // input
OutputArray dst, //Destination image
int ddepth, // Desired depth of the destination image.
int ksize = 1, // kernel size
double scale = 1, // 比例
double delta = 0, //偏移
int borderType = BORDER_DEFAULT //
)
还没有评论,来说两句吧...