/*
* Laplace算子
求导,通过二阶导数获得图像边缘,这也是一个卷积理论的延伸,可以通过卷积求取图像的边缘,Laplace算子也是一个卷积核
理论:
前一节我们学习了 Sobel 算子 ,其基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。
如果在此边缘部分求取一阶导数,你会看到极值的出现。
你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。
但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点。
有lanplace算子来解决二阶导数,直接用,opencv提供了相关的API-cv::Laplace
处理流程:
1.使用高斯平滑消除噪声,
2.将图像转换到灰度空间。(在彩色图像上直接提取边缘就是大错特错了)
3.使用Laplacian算子作用于灰度图像,并保存输出图像。
4.取绝对值convertScaleAbs()
laplace之后图像可能有正值有负值,无论是正的还是负的都代表图像它之间的差异,
这些值都是特征,我们一定要留住,负的要是舍掉就出大问题了,深度也变成8位的了即深度转化为 CV_8U
5.输出结果
*/
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src, res;
src = imread("D:/A_Graduation/Pictures/Segmentatio/1.jpg");
imshow("src", src);
//高斯模糊
//不是真的要把它模糊掉,而是稍微模糊一点点把那些小的噪点给去掉,所以3*3的就行了
Mat gray_res, edge_image;
GaussianBlur(src, res, Size(3, 3), 0, 0);
cvtColor(res, gray_res, CV_BGR2GRAY);
//laplace
Laplacian(gray_res, edge_image, CV_16S, 3); //第三个参数为位图的深度
//取它的绝对值
convertScaleAbs(edge_image, edge_image); //变成8位的
//laplace找出来的边缘它的噪声还是比较明显的,我们对这个边缘可以进一步做一个处理
threshold(edge_image, edge_image, 0, 255, THRESH_OTSU | THRESH_BINARY);
//显示
imshow("edge_image", edge_image);
waitKey(0);
return 0;
}