欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV--032:自定义的滤波器

程序员文章站 2023-12-23 17:53:27
...

前面已经对图像进行了模糊处理,介绍了几种滤波算法。OpenCV中还可以通过相应API来定义卷积操作,也就是设定自定义的卷积算子。

下面三个自定义的卷积核就分别可以实现均值模糊、图像锐化和图像梯度的功能:
OpenCV--032:自定义的滤波器

OpenCV中API

  • 函数说明

    将图像与内核卷积。

    该函数将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该函数会根据指定的边框模式对异常像素值进行插值。

    该函数实际上会计算相关性,而不是卷积:
    dst(x,y)=0y<kernel.rows0x<kernel.colskernel(x,y)src(x+xanchor.x,y+yanchor.y)dst(x,y)=∑_{0≤y′<kernel.rows}^{0≤x′<kernel.cols}kernel(x′,y′)∗src(x+x′−anchor.x,y+y′−anchor.y)
    对于足够大的内核(〜11 x 11或更大),该函数使用基于DFT的算法,对于较小的内核,该函数使用直接算法。

  • 函数声明

    void filter2D( 
            InputArray src, 
            OutputArray dst, 
            int ddepth,
            InputArray kernel, 
            Point anchor = Point(-1,-1),
            double delta = 0, 
            int borderType = BORDER_DEFAULT
    );
    
  • 函数参数

    src 输入图像
    dst 和src具有相同尺寸和类型的输出图像
    ddepth 目标图像的所需深度。ddepth默认为-1,此时表示输入与输出图像类型一致
    kernel 卷积核(或一个相关核),一个单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用split将图像分为单独的色彩平面,并分别进行处理。
    anchor 内核的锚点,指示内核中已过滤点的相对位置;锚点应位于内核内;默认值(-1,-1)表示锚位于内核中心。
    delta 在将像素存储到dst之前将其添加到过滤后的像素的可选值。

    ddepth,当涉及到浮点数计算或者计算会产生负值的时候,需要将ddepth设为CV_32F类型,在滤波完成之后在使用下面的convertScaleAbs函数将图像从浮点型转为字节类型。

    void convertScaleAbs(
               InputArray src, 
    		   OutputArray dst,
               double alpha = 1,
               double beta = 0);
    
  • 举例应用

    int main() {
    	Mat src = imread("D:/test/src.jpg");
    	Mat kernel1 = Mat::ones(5, 5, CV_32F) / (float)(5 * 5);
    
    	
    	//kernel定义则使用了重载
    	Mat kernel2 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5 ,- 1, 0, -1, 0);
    	Mat kernel3 = (Mat_<int>(2, 2) << 1, 0, 0, -1);
    
    	Mat dst1, dst2, dst3, dst4;
    	filter2D(src, dst1, -1, kernel1);
    	filter2D(src, dst2, -1, kernel2);
    
    	//浮点数计算或者计算会产生负值的时候,
    	//需要将ddepth设为CV_32F类型,
    	//在滤波完成之后在使用下面的convertScaleAbs函数将图像从浮点型转为字节类型。
    	filter2D(src, dst3, CV_32F, kernel3);
    	convertScaleAbs(dst3, dst3);
    
    	imshow("src", src);
    	imshow("dst1", dst1);
    	imshow("dst2", dst2);
    	imshow("dst3", dst3);
    
    	waitKey(0);
    
    	return 0;
    }
    

    OpenCV--032:自定义的滤波器
    OpenCV--032:自定义的滤波器
    OpenCV--032:自定义的滤波器
    OpenCV--032:自定义的滤波器

相关标签: filter2D

上一篇:

下一篇: