/*
*自定义线性滤波
前言:之前讲过的掩膜,什么一般的滤波,一般的模糊如中值模糊,高斯模糊,这些内容从本质上来讲它都属于一个概念就是卷积
所以我们在介绍自定义线性滤波的时候其实我们就是在介绍卷积,前面讲的是卷积的第一功能,卷积可以模糊一幅图像,可以降低
图像的噪声,我们模糊的目的就是降噪,降低噪声
*卷积概念:
卷积其实是一个数学的概念,图像上借用过来叫卷积操作的话
卷积是图像处理中一个操作,是kernel(卷积核又称为算子)在图像的每个像素上的操作
kernel(卷积核)本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
*卷积如何工作:
把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理,有数学公式
卷积有三个作用:模糊图像,提取边缘,可以进行图像甄选进行图像的锐化
*常见算子
Robert算子 2*2的一个卷积核
Sobel算子 在边缘检测当中经常会用到,也是canny边缘检测最重要的中间的一步,通过Sobel算子求得梯度
拉普拉斯算子 和Sobel算子寻找梯度,寻找图像的边缘,同样Robert算子也可以做这样的功能
*自定义卷积模糊
filter2D方法
filter2D(Mat drc, //输入图像
Mat dst, //模糊图像
int depth, //图像深度32/8
Mat kernel, // 卷积核/模板
Point anchor, //锚点位置 输入的卷积核的大小一般都要是奇数 Point(-1, -1)自动找到中心位置
double delta //计算出来的像素+delta)
其中kernel是可以自定义的卷积核
*/
#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);
//Robert算子 叫做梯度算子,去做图像的x方向的梯度和y方向的梯度得到的结果
//两个45度,一个顺时针方向的45度,一个逆时针方向的45度,假设这个叫x方向
Mat kernel_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);
filter2D(src, res, -1, kernel_x, Point(-1, -1));
imshow("Robert_x", res);
//Y方向
Mat kernel_y = (Mat_<int>(2, 2) << 0, 1, -1, 0);
filter2D(src, res, -1, kernel_y, Point(-1, -1));
imshow("Robrt_y", res);
//Sobel算子
//水平方向 x方向 ... 竖直方向 y方向 .. 和上面的代码差不多 略
//拉普拉斯算子 前面是说x方向y方向不同的差异,这个算子得到的是整个的差异 拉普拉斯算子是一个边缘检测的算子
//和上面的代码差不多 略
//还可以做进一步的处理,把小于一定值的给去掉,对边缘再进行加强
//通过拉普拉斯可以获得图像的主要的轮廓,主要特征和信息
//自定义卷积模糊
Mat kernel = Mat::ones(Size(3, 3), CV_32F) / (float)(3 * 3); //算子的里面的值全是1
filter2D(src, res, -1, kernel);
imshow("kernel", res);
waitKey(0);
return 0;
}