filter2D
函数
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:是图像外边缘的填充的方法。
Mat
与filter2D一般一起使用的是: Mat kenrnel
// << 后面的内容只是一种情况,可以根据不同的需求来改变
// (3, 3)也可以改变,它只是代表Mat的行和列。
Mat kernel = (Mat_<int>(3, 3)<< -1, 0, -1, 0, 4, 0, -1, 0, -1);
demo
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
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_<char>(3, 3) <<0, -1, 0, -1, 4, -1, 0, -1, 0); // 拉普拉斯算子
Mat kernel2 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); // 增大对比度
Mat kernel3 = (Mat_<char>(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;
}
operator
-
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);