opencv filter2D函数

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_(3, 3)<< -1, 0, -1, 0, 4, 0, -1, 0, -1);

demo

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


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

你可能感兴趣的:(opencv)