1. C/C++

OpenCV-第十三话-自定义线性滤波

一.写在前面

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;
}