一.写在前面
1.复习一下卷积概念
#卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。
#Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
2.卷积如何工作
把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),
用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下:

二.常见算子

Laplace算子

Robert算子

Sobel算子
三.代码实现
/*
OpenCV 自定义线性滤波学习
Michael Jiang<sencom1997@outlook.com>
2019年7月25日14:35:42
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
	Mat src, robert, xsobel, ysobel, laplace;
	namedWindow("src", WINDOW_AUTOSIZE);
	namedWindow("robert", WINDOW_AUTOSIZE);
	namedWindow("xsobel", WINDOW_AUTOSIZE);
	namedWindow("ysobel", WINDOW_AUTOSIZE);
	namedWindow("laplace", WINDOW_AUTOSIZE);
	//读取图像
	src = imread("D:/linus.jpg", IMREAD_COLOR);
	imshow("src", src);
	//判断读取是否成功
	if (src.empty()) {
		printf("pic load failed!\n");
		return -1;
	}
	//Robert算子
	Mat robert_kernel = (Mat_<char>(2, 2) << 1, 0, 0, -1);
	filter2D(src, robert, -1, robert_kernel);
	imshow("robert", robert);
	
	//xsobel算子
	Mat xsobel_kernel = (Mat_<char>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
	filter2D(src, xsobel, -1, xsobel_kernel);
	imshow("xsobel", xsobel);
	//ysobel算子
	Mat ysobel_kernel = (Mat_<char>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
	filter2D(src, ysobel, -1, ysobel_kernel);
	imshow("ysobel", ysobel);
	//laplace算子
	Mat laplace_kernel = (Mat_<char>(3,3) << 0,-1,0,-1,4,-1,0,-1,0);
	filter2D(src, laplace, -1, laplace_kernel);
	imshow("laplace", laplace);
	waitKey(0);
	return 0;
}