为了设计一个自定义的滤波器,我们定义了一个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.调用自定义的滤波器后(其实是一个拉普拉斯算子,后面会遇到!)