CV_EXPORTS_W void filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor=Point(-1,-1),
double delta=0,
int borderType=BORDER_DEFAULT
);
src: 原图像;
dst:输出图像 ,和输入的图像具有相同的尺寸和类型,以及通道类型
int deepth: 目标图像深度, 目标图像的深度,一定要>= src.depth(); 选择-1时,目标图像与原图像的深度保持一致。
src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F
kernerl: 过滤器(卷积核), 用于对于原图像的进行卷积,生成目标图像,不同的kernel,会产生不同的效果。
delta:在生成目标图像前,可以选择添加的像素值,默认值为0。
borderType:是图像外边缘的填充的方法。
边界填充参考资料
与filter2D一般一起使用的是: Mat kenrnel
// << 后面的内容只是一种情况,可以根据不同的需求来改变
// (3, 3)也可以改变,它只是代表Mat的行和列。
Mat kernel = (Mat_(3, 3)<< -1, 0, -1, 0, 4, 0, -1, 0, -1);
#include "pch.h"
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src;
src = imread("f:/1.png");
if (!src.data) {
cout << "fail opening the file....." << endl;
}
imshow("", src);
Mat kernel1 = (Mat_(3, 3) <<0, -1, 0, -1, 4, -1, 0, -1, 0); // 拉普拉斯算子
Mat kernel2 = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); // 增大对比度
Mat kernel3 = (Mat_(3, 3) << -1, 0, -1, 0, 4, 0, -1, 0, -1);
Mat dst, dst2, dst3;
filter2D(src, dst, -1, kernel1);
filter2D(src, dst2, -1, kernel2);
filter2D(src, dst3, -1, kernel3, Point(-1, -1), 50.0);
imshow("out", dst);
imshow("out2", dst2);
imshow("out3", dst3);
waitKey(0);
return 0;
}
Robert Operator
Mat kernel = (Mat_<int> << -1, 0, 0, 1);
Mat kernel = (Mat_<int> << 0, -1, 1, 0);
Sobel Operator
Mat kernel = (Mat_<int> << -1, -2, -1, 0, 0 ,0, 1, 2, 1);
Mat kernel = (Mat_<int> << -1, 0, 1, -2, 0, 2, -1, 0, 1);
Laplace Operator
Mat kernel = (Mat_<char>(3, 3) <<0, -1, 0, -1, 4, -1, 0, -1, 0);