一.写在前面
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;
}