1

conv2函数

C=conv2(A,B,shape); %卷积滤波 
参数说明: 
A:输入图像 
B:卷积核 
shape的可选值为full、same、valid。 
1)当shape=full时,返回全部二维卷积结果,即返回B的大小为(ma+mb-1)x(na+nb-1)。 
2)shape=same时,返回与A同样大小的卷积中心部分。 
3)shape=valid时,不考虑边界补零,即只要有边界补出的零参与运算的都舍去,返回B的大小为(ma-mb+1)x(na-nb+1)。 
上面叙述看起来略有些抽象,可以结合下面的图一起理解。 
3种参数的区别见图。 
 
 

filter2函数

B = filter2(h,A,shape) ; %相关(correlation)滤波 
这里需要明晰一下卷积和相关的区别,卷积操作就是先将卷积核旋转180度然后再和核大小相同的区域内的各元素对应相乘再相加。也就是核旋转180后卷积。而相关操作就是直接用核卷积,不做旋转。注意,我在叙述的时候,把2个区域对应元素相乘再相加这一个操作称为卷积。 
参数说明: 
A:输入图像,h:相关核 
假设输入图像A大小为ma x na,相关核h大小为mb x nb。 
1)当shape=full时,返回全部二维卷积结果,即返回B的大小为(ma+mb-1)x(na+nb-1) 
2)shape=same时,返回与A同样大小的卷积中心部分。 
3)shape=valid时,不考虑边界补零,即只要有边界补出的零参与运算的都舍去,返回B的大小为(ma-mb+1)x(na-nb+1)。

imfilter函数

imfilter函数能够实现3通道的RGB图像和单通道的滤波器的卷积,并且返回的图像也是3通道的。 
B=imfilter(A,H,option1,option2,option3); 
参数说明: 
A:输入图像,H:滤波核 
1)option1:边界选项,可选的有:补充固定的值X(默认都补零),symmetric,replicate,circular 
2)option2:输出图像大小选项,可选的有same(默认),full 
3)option3:决定采用与filter2相同的相关滤波还是与conv2相同的卷积滤波

三者的比较

1)filter2输入类型无所谓,输出是double的,输入在边界总是补零(zero padded), 不支持其他的边界补充选项。 
2)conv2的输入只能为double型的,否则会提示警告,输出也是double型的。 
2) imfilter:不一定要将输入转换为double,但是输出只与输入同类型,有灵活的边界补充选项。有symmetric、replicate,same等。 
在适用图像的维度上,imfilter可进行多维图像(RGB等)进行空间滤波,filter2 只能对二维图像(灰度图)进行空间滤波,conv2可以对图像矩阵实现自己想实现的卷积操作,最简单最常用的是二维。所以conv2和filter2类似,多维图像(RGB等)要用imfilter。

【2】

二维卷积的算法原理比較简单,參考随意一本数字信号处理的书籍,而matlab的conv2函数的滤波有个形状參数,用以下的一张图非常能说明问题:

这里给出一种最原始的实现方案。这样的实现对于数据矩阵大小为1000x1000,卷积核矩阵大小为20x20,在我的机器上须要大约1秒钟的时间。而matlab採用的MKL库最快仅仅须要将近0.1s的时间。

以下的代码用到了自己眼下开发的FastIV中的一些函数接口。详细代码例如以下:

#include "fiv_core.h"

typedef enum{
FIV_CONV2_SHAPE_FULL,
FIV_CONV2_SHAPE_SAME,
FIV_CONV2_SHAPE_VALID
}FIV_CONV_SHAPE; void fIv_conv2(fIvMat** dst_mat, fIvMat* src_mat, fIvMat* kernel_mat, FIV_CONV_SHAPE shape)
{
int src_row = src_mat->rows;
int src_cols = src_mat->cols;
int kernel_row = kernel_mat->rows;
int kernel_cols = kernel_mat->cols;
int dst_row = 0, dst_cols = 0, edge_row = 0, edge_cols = 0;
int i,j, kernel_i,kernel_j,src_i,src_j;
fIvMat* ptr_dst_mat = NULL; switch(shape){
case FIV_CONV2_SHAPE_FULL: dst_row = src_row + kernel_row - 1;
dst_cols = src_cols + kernel_cols - 1;
edge_row = kernel_row - 1;
edge_cols = kernel_cols - 1;
break; case FIV_CONV2_SHAPE_SAME: dst_row = src_row;
dst_cols = src_cols;
edge_row = (kernel_row - 1) / 2;
edge_cols = (kernel_cols - 1) / 2;
break; case FIV_CONV2_SHAPE_VALID: dst_row = src_row - kernel_row + 1;
dst_cols = src_cols - kernel_cols + 1;
edge_row = edge_cols = 0;
break; } ptr_dst_mat = fIv_create_mat(dst_row, dst_cols, FIV_64FC1);
*dst_mat = ptr_dst_mat; for (i = 0; i < dst_row; i++) {
ivf64* ptr_dst_line_i = (ivf64* )fIv_get_mat_data_at_row(ptr_dst_mat, i);
for (j = 0; j < dst_cols; j++) {
ivf64 sum = 0; kernel_i = kernel_row - 1 - FIV_MAX(0, edge_row - i);
src_i = FIV_MAX(0, i - edge_row); for (; kernel_i >= 0 && src_i < src_row; kernel_i--, src_i++) { ivf64* ptr_src_line_i,*ptr_kernel_line_i; kernel_j = kernel_cols - 1 - FIV_MAX(0, edge_cols - j);
src_j = FIV_MAX(0, j - edge_cols); ptr_src_line_i = (ivf64*)fIv_get_mat_data_at_row(src_mat, src_i);
ptr_kernel_line_i = (ivf64*)fIv_get_mat_data_at_row(kernel_mat, kernel_i); ptr_src_line_i += src_j;
ptr_kernel_line_i += kernel_j; for (; kernel_j >= 0 && src_j < src_cols; kernel_j--, src_j++){
sum += *ptr_src_line_i++ * *ptr_kernel_line_i--;
}
}
ptr_dst_line_i[j] = sum;
}
}
} FIV_ALIGNED(16) ivf64 ker_data[4*4] = {0.1,0.2,0.3,0.4,
0.5,0.6,0.7,0.8,
0.9,1.0,1.1,1.2,
1.3,1.4,1.5,1.6}; void test_conv2()
{
fIvMat* src_mat = fIv_create_mat_magic(8, FIV_64FC1); // 8x8 magic matrix
fIvMat* kernel_mat = fIv_create_mat_header(4, 4, FIV_64FC1); fIvMat* dst_mat = NULL;
fIv_set_mat_data(kernel_mat, ker_data, (sizeof(ivf64)) * 4 * 4); fIv_conv2(&dst_mat, src_mat, kernel_mat, FIV_CONV2_SHAPE_FULL); fIv_export_matrix_data_file(dst_mat,"dst_mat_4x4-full.txt", 1); fIv_release_mat(&src_mat);
fIv_release_mat(&kernel_mat);
fIv_release_mat(&dst_mat); } int main()
{
test_conv2(); return 0;
}

matlab的conv2、imfilter、filter2的更多相关文章

  1. MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)

    转载: 1.https://blog.csdn.net/jinv5/article/details/52874880 2.https://blog.csdn.net/majinlei121/artic ...

  2. conv2、filter2、imfilter的区别

    conv2.filter2.imfilter的区别 -------------------------------------conv2函数------------------------------ ...

  3. Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)

    Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)     最近在做控制算法实现的时候,对于其中参杂的各种差分.卷积很头疼,就在网上搜集了些资料,汇总于此,以做备 ...

  4. 图像处理中任意核卷积(matlab中conv2函数)的快速实现。

    卷积其实是图像处理中最基本的操作,我们常见的一些算法比如:均值模糊.高斯模糊.锐化.Sobel.拉普拉斯.prewitt边缘检测等等一些和领域相关的算法,都可以通过卷积算法实现.只不过由于这些算法的卷 ...

  5. matlab中imfilter、conv2、imfilter2用法及区别

    来源 :https://blog.csdn.net/u013066730/article/details/56665308(比较详细) https://blog.csdn.net/yuanhuilin ...

  6. MATLAB conv2卷积的实现

    MATLAB conv2卷积的实现 二维卷积的算法原理比较简单,参考任意一本数字信号处理的书籍,而matlab的conv2函数的滤波有个形状参数,用下面的一张图很能说明问题: 这里给出一种最原始的实现 ...

  7. MATLAB卷积运算(conv、conv2、convn)解释

    1 conv(向量卷积运算) 所谓两个向量卷积,说白了就是多项式乘法.比如:p=[1 2 3],q=[1 1]是两个向量,p和q的卷积如下:把p的元素作为一个多项式的系数,多项式按升幂(或降幂)排列, ...

  8. 【转】MATLAB conv2函数的理解

    另附:http://blog.csdn.net/anan1205/article/details/12313593 原文:http://blog.csdn.net/andrewseu/article/ ...

  9. Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现

    http://blog.sciencenet.cn/blog-95484-803140.html % %图像灰度变换 % f = imread('E:\2013第一学期课程\媒体计算\实验一\Img\ ...

随机推荐

  1. [android] 手机卫士保存安全号码

    调用ListView对象的setOnItemClickListener()方法,设置条目的点击事件,参数:OnItemClickListener对象 使用匿名内部类实现,重写onClick()方法,传 ...

  2. elasticsearch6.7 01.入门指南(2)

    2.安装(略) 默认情况下,elasticsearch 使用端口 9200 来访问它的 REST API.如果有必要,该端口也可以配置 3.探索集群 3.1 The REST API 既然我们已经启动 ...

  3. Team Foundation Server 2013 KEY(密钥)

    isual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥): ...

  4. canvas-tangram.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. POM、STS、IOC、DI、AOP

    POM:全称:poject object model 说明:项目对象模型.maven用来管理项目的依赖.编译.文档等信息 STS: 全称:spring tool suite 说明:spring 基于e ...

  6. 【代码笔记】Web-ionic-select

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. [Android] 设置AlertDialog中按钮的可用(Enable)状态

    弹出一个保存文件的对话框,要控制输入内容限制,同时内容为空时保存按钮不可用. 原文地址请保留http://www.cnblogs.com/rossoneri/p/4140184.html 直接上代码: ...

  8. 结对项目-四则运算"软件"之升级版

    本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 github地址为:https://github.com/L ...

  9. 分享MYSQL中的各种高可用技术

    分享MYSQL中的各种高可用技术 图片和资料来源于姜承尧老师(MYSQL技术内幕作者) mysql高可用各个技术的比较 数据库的可靠指的是数据可靠 数据库可用指的是数据库服务可用 可靠的是数据:例如工 ...

  10. 几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比

    AJAX是web2.0的基石,现在网上流行几种开源的AJAX框架,比如:jQuery,Mootools,Dojo,Ext JS等等,那么我们到底在什么情况下该使用那个框架? 让我们来想想选择AJAX框 ...