opencv学习(七)之图像卷积运算函数filter2D()
opencv学习(七)之图像卷积运算函数filter2D()
https://blog.csdn.net/keith_bb/article/details/53103026
接上篇 
在其官方文档中,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
 
运行结果如下:  
与上一篇运行结果相比并没有黑边存在!
- 本文已收录于以下专栏:
 - opencv2/3基础教程
 
#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
正在学习《opencv2计算机视觉编程手册》;
编写了一段代码,显示“未定义标识符filter2D”;
问题在于我 没有包含 含有定义filter2D的头文件——#include<opencv2/imgproc/imgproc.hpp>。
修正后的代码如下:
- #include<opencv2/core/core.hpp>
 - #include<opencv2/highgui/highgui.hpp>
 - #include<opencv2/imgproc/imgproc.hpp>
 - #include<iostream>
 - using namespace cv;
 - using namespace std;
 - void sharpen2D(const Mat &image,Mat &result){
 - Mat kernel(3,3,CV_32F,Scalar(0));
 - kernel.at<float>(1,1) = 5.0;
 - kernel.at<float>(0,1) = -1.0;
 - kernel.at<float>(2,1) = -1.0;
 - kernel.at<float>(1,0) = -1.0;
 - kernel.at<float>(2,0) = -1.0;
 - filter2D(image,result,image.depth(),kernel);
 - }
 - int main(void){
 - Mat image = imread("1.jpg",0);
 - Mat result;
 - result.create(image.size(),image.type());
 - sharpen2D(image,result);
 - namedWindow("sharpenPic");
 - imshow("sharpenPic",result);
 - waitKey(0);
 - return 0;
 - }
 

                
            
        
浙公网安备 33010602011771号