使用opencv实现自定义卷积
对图像进行卷积是图像处理的基本操作,最近在研究图像滤波,经常要用到自定义卷积,所以实现了一下
1 #include "opencv2/imgproc/imgproc.hpp" 2 #include "opencv2/highgui/highgui.hpp" 3 4 using namespace cv; 5 6 Mat get_blur_kernel(int kernel_size);//获得归一化滤波的卷积核 7 8 int main(int argc, char ** argv) 9 { 10 Mat src, dst; 11 Point anchor; 12 double delta; 13 int ddepth; 14 int kernel_size = 5; 15 // 生成一个掩模核 大小为kernel_size*kernel_size,这里我们用归一化块滤波的卷积核做示例 16 Mat kernel = get_blur_kernel(kernel_size); 17 // 载入一张图片 18 src = imread("a.jpg"); 19 if (!src.data) 20 return -1; 21 22 // 创建窗口 23 imshow("before",src); 24 waitKey(500); 25 // 初始化滤波器参数 26 anchor = Point(-1, -1); 27 delta = 0; 28 ddepth = -1; 29 //将核设置好之后,使用函数 filter2D 就可以生成滤波器: 30 filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT); 31 32 imshow("after", dst); 33 waitKey(0); 34 return 0; 35 } 36 37 //生成归一化滤波的卷积核,通过对kernel.ptr(i)[j]的操作来进行 38 Mat get_blur_kernel(int kernel_size) 39 { 40 Mat kernel = (Mat_<float>(kernel_size, kernel_size)); 41 for (int i = 0; i < kernel_size; i++) 42 { 43 for (int j = 0; j < kernel_size; j++) 44 kernel.ptr<float>(i)[j] = 1.0 / (kernel_size*kernel_size); 45 } 46 return kernel; 47 }
卷积核kernel其实也是一个Mat对象,我们可以通过kernel.ptr(i)[j]实现对矩阵元素的直接操作,
将核设置好之后,使用opencv提供的函数 filter2D 就可以生成滤波器:
filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
其中各参数含义如下:
src : 源图像
dst : 目标图像
ddepth : dst 的深度。若为负值(如 - 1 ),则表示其深度与源图像相等。
kernel : 用来遍历图像的核
anchor : 核的锚点的相对位置,其中心点默认为(-1, -1) 。
delta : 在卷积过程中,该值会加到每个像素上。默认情况下,这个值为 0 。
BORDER_DEFAULT : 这里我们保持其默认值,更多细节将在其他教程中详解
只需改变卷积核,我们就可以使用类似的方法创造自定义滤波了。
作者: Elliott Zheng
出处: http://www.cnblogs.com/elliottzheng/p/6616869.htmlp/6664218.html>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(elliott.zheng@foxmail.com)咨询.