opencv学习(七)之图像卷积运算函数filter2D()
2016-11-09 18:08
756 查看
接上篇
在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍。
对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下:
其官方指导文件对filter2D()函数的描述为:Convolves an image with kernel即利用内核实现对图像的卷积运算。参数含义如下:
InputArray src: 输入图像
OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量
int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像。原图像和目标图像支持的图像深度如下:
当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()检索得到).
示例程序如下:
运行结果如下:
与上一篇运行结果相比并没有黑边存在!
在其官方文档中,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 );
其官方指导文件对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
当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; }
运行结果如下:
与上一篇运行结果相比并没有黑边存在!
相关文章推荐
- (未实用 需多个函数配套使用)opencv3.0 函数学习 10——morphologyEx 形态学图像处理:开运算、闭运算、形态学梯度、顶帽、黑帽合辑
- OpenCV学习-常用的图像和矩阵操作函数
- 学习OpenCV(三)用filter2D实现矩阵掩码操作
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- OpenCV 学习(图像的基本运算)
- OpenCV学习:将图像转为二值图像(函数cvtColor和函数threshold)
- 对图像像素的高效操作(卷积filter2D)
- OpenCV学习——图像装载函数的模拟加载24BPP的BMP文件
- opencv中卷积函数cvFilter2D
- 计算机视觉与图像处理学习笔记(三)opencv的基本数据类型与简单图像处理函数
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
- 【OpenCV学习笔记】【函数学习】二十(访问图像像素)
- OpenCV学习笔记(6):滤波filter2D()
- OpenCV学习——图像卷积滤波
- 学习OpenCV(三)用filter2D实现矩阵掩码操作
- 【OpenCV学习笔记】【函数学习】十一(读入图像﹑显示图像和保存图像)
- MATLAB函数的filter2 conv2 imfilter2函数 与opencv中的cvFilter2D函数的异同及图像的频率滤波
- OpenCV 学习(图像的基本运算)
- OpenCV学习:将图像转为二值图像(函数cvtColor和函数threshold)