opencv学习(七)之图像卷积运算函数filter2D()

opencv学习(七)之图像卷积运算函数filter2D()

https://blog.csdn.net/keith_bb/article/details/53103026

原创 2016年11月09日 18:08:36

接上篇 
在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍。 
对于使用掩模板矩阵(kernel)计算每个像素值,结合函数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 );
  • 1
  • 2
  • 3

其官方指导文件对filter2D()函数的描述为:Convolves an image with kernel即利用内核实现对图像的卷积运算。参数含义如下:

InputArray src: 输入图像

OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量

int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像。原图像和目标图像支持的图像深度如下:

    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
  • 1
  • 2
  • 3
  • 4
  • 5

当ddepth输入值为-1时,目标图像和原图像深度保持一致。

InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开。

Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。

double delta: 在储存目标图像前可选的添加到像素的值,默认值为0

int borderType: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

该函数使用于任意线性滤波器的图像,支持就地操作。当其中心移动到图像外,函数可以根据指定的边界模式进行插值运算。函数实质上是计算kernel与图像的相关性而不是卷积: 
这里写图片描述 
也就是说kernel并不是中心点的镜像,如果需要一个正真的卷积,使用函数flip()并将中心点设置为(kernel.cols - anchor.x - 1, kernel.rows - anchor.y -1). 
该函数在大核(11x11或更大)的情况下使用基于DFT的算法,而在小核情况下使用直接算法(使用createLinearFilter()检索得到). 
示例程序如下:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat srcImage = imread("lena.jpg");

    //判断图像是否加载成功
    if(srcImage.data)
        cout << "图像加载成功!" << endl << endl;
    else
    {
        cout << "图像加载失败!" << endl << endl;
        return -1;
    }
    namedWindow("srcImage", WINDOW_AUTOSIZE);
    imshow("srcImage", srcImage);

    Mat kern = (Mat_<char>(3,3) << 0, -1 ,0,
                                   -1, 5, -1,
                                   0, -1, 0);
    Mat dstImage;
    filter2D(srcImage,dstImage,srcImage.depth(),kern);
    namedWindow("dstImage",WINDOW_AUTOSIZE);
    imshow("dstImage",dstImage);


    waitKey(0);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

运行结果如下: 
这里写图片描述 
与上一篇运行结果相比并没有黑边存在!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keith_bb/article/details/53103026
#include <iostream>
//#include <opencv2/core.hpp>
//#include <opencv2/highgui.hpp>
//#include <opencv2/imgproc.hpp>

#include <stdio.h>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat srcImage = imread("lena.jpg");

    //判断图像是否加载成功
    if(srcImage.data)
        cout << "图像加载成功!" << endl << endl;
    else
    {
        cout << "图像加载失败!" << endl << endl;
        return -1;
    }
    namedWindow("srcImage", WINDOW_AUTOSIZE);
    imshow("srcImage", srcImage);

    Mat kern = (Mat_<char>(3,3) << 0, -1 ,0,
                                   -1, 5, -1,
                                   0, -1, 0);
    Mat kern2 = (Mat_<char>(3,3) << -1, -1 ,-1,
                                    -1, 9, -1,
                                    -1, -1, -1);

    Mat dstImage;
    filter2D(srcImage,dstImage,srcImage.depth(),kern);
    namedWindow("dstImage",WINDOW_AUTOSIZE);
    imshow("dstImage",dstImage);
    //waitKey(0);
    //
    filter2D(srcImage,dstImage,srcImage.depth(),kern2);
    namedWindow("dstImage2",WINDOW_AUTOSIZE);
    imshow("dstImage2",dstImage);
    //
    waitKey(0);
    //
    return 0;
}

https://blog.csdn.net/lay_zy/article/details/78319693

未定义标识符filter2D

原创 2017年10月23日 15:57:13

正在学习《opencv2计算机视觉编程手册》;

编写了一段代码,显示“未定义标识符filter2D”;

问题在于我 没有包含 含有定义filter2D的头文件——#include<opencv2/imgproc/imgproc.hpp>。

修正后的代码如下:

 

[cpp] view plain copy
 
  1. #include<opencv2/core/core.hpp>  
  2. #include<opencv2/highgui/highgui.hpp>  
  3. #include<opencv2/imgproc/imgproc.hpp>  
  4. #include<iostream>  
  5.   
  6. using namespace cv;  
  7. using namespace std;  
  8.   
  9. void sharpen2D(const Mat &image,Mat &result){  
  10.     Mat kernel(3,3,CV_32F,Scalar(0));  
  11.   
  12.     kernel.at<float>(1,1) = 5.0;  
  13.     kernel.at<float>(0,1) = -1.0;  
  14.     kernel.at<float>(2,1) = -1.0;  
  15.     kernel.at<float>(1,0) = -1.0;  
  16.     kernel.at<float>(2,0) = -1.0;  
  17.   
  18.     filter2D(image,result,image.depth(),kernel);  
  19. }  
  20.   
  21. int main(void){  
  22.     Mat image = imread("1.jpg",0);  
  23.     Mat result;  
  24.     result.create(image.size(),image.type());  
  25.   
  26.     sharpen2D(image,result);  
  27.     namedWindow("sharpenPic");  
  28.     imshow("sharpenPic",result);  
  29.     waitKey(0);  
  30.   
  31.     return 0;  
  32. }  
posted @ 2018-03-26 00:08  sky20080101  阅读(914)  评论(0)    收藏  举报