【OpenCV3经典编程100例】(07)空间滤波:自定义一个滤波器filter2D()

为了设计一个自定义的滤波器,我们定义了一个diyFilter2D()函数。

首先定义一个核函数(3*3的矩阵),然后调用cv::filter2D()函数即可!

API函数

//滤波器filter2D()
void filter2D(InputArray src,//输入图像
	        OutputArray dst, //输出图像
		int ddepth,//图像深度
		InputArray kernel,//输入的核函数
		Point anchor = Point(-1, -1),//默认,表示锚点在核的中心
		double delta = 0,//默认
		int borderType = BORDER_DEFAULT);//默认,表示边界模式

一、c++示例代码

//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分
void diyFilter2D(const Mat &src, Mat &dst);

//主函数
int main()
{
	//【1】载入图像,灰度化
	Mat image = imread("F:\\opencvtest\\testImage\\beauty.png", 0);
	//【2】检查是否载入成功
	if (image.empty())
	{
		printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
		return 0;
	}
	//【3】自定义的滤波器
	Mat result;
	diyFilter2D(image, result);
	//【4】显示图像
	imshow("示例07", result);
	//【5】保持窗口显示
	waitKey(0);
	return 0;
}
//自定义的滤波器
void diyFilter2D(const Mat &src, Mat &dst)
{
	//自定义核函数,3*3
	//[0  1  0]
	//[1 -4  1]
	//[0  1  0]
	//其实,这就是拉普拉斯算子的核函数
	Mat kernel(3, 3, CV_32F, Scalar(0));
	kernel.at<float>(1, 1) = -4.0;
	kernel.at<float>(0, 1) = 1.0;
	kernel.at<float>(2, 1) = 1.0;
	kernel.at<float>(1, 0) = 1.0;
	kernel.at<float>(1, 2) = 1.0;
	//调用filter2D()函数
	filter2D(src, dst, src.depth(), kernel);
}

二、运行截图

1.灰度图原图


2.调用自定义的滤波器后(其实是一个拉普拉斯算子,后面会遇到!)



猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80299506
今日推荐