转载自:http://blog.csdn.net/anan1205/article/details/12313593

两个矩阵卷积转化为矩阵相乘形式——Matlab应用(这里考虑二维矩阵,在图像中对应)两个图像模糊(边缘)操作,假设矩阵A、B,A代表源图像,B代表卷积模板,那么B的取值决定最后运算的结果。

Matlab中的应用函数——conv2(二维卷积,一维对应conv)

函数给出的公式定义为:

同一维数据卷积一样,它的实质在于将卷积模板图像翻转(旋转180),这里等同于一维信号的翻转,然后将卷积模板依次从上到下、从左到右滑动,计算在模板与原始图像交集元素的乘积和,该和就作为卷积以后的数值。

为了验证后续矩阵卷积转化为矩阵相乘,这里给出的conv2的实例描述:

假设矩阵A(4*3)、B(2*3)如下:

首先,B需要旋转180,

命令旋转2次90即可:

B = rot90(rot90(B));或者B = rot90(h,2);  结果为:

其次:命令conv2函数:

C = conv2(A,B,‘shape’),该函数的具体操作图示:

依次计算直至结束,结果数据为:

shape的取值有三种,full代表返回卷积以后的全部数据,size为(mA+mB-1,nA+nB-1)的数据;same代表返回卷积以后的原图size (mA,nA)的部分数据;valid返回size为(mA-mB+1,nA-nB+1)的数据,指的是模板元素全部参加运算的结果数据,即源图像和模板的交集为模板。

矩阵卷积转化为矩阵相乘,网上也有很多方法,通俗化表示为:

A×B = B1*A1;

需要针对原始数据与模板数据做变换,变换过程如下:

 首先进行周期延拓,补零:

M = mA+mB-1 = 5;  N = nA+nB-1 = 5,对应卷积以后full数据大小。

那么初次换换的A和B为:

其次对A1和B1分别进行变换

转化B1——针对B1以及转换矩阵方法为:

将B1中的每一行向量依次按照B转化为一个方形矩阵Ba~Be,然后针对于每一个方形矩阵按照B矩阵组合成一个新的矩阵B1。B1矩阵的大小为((mA+mB-1)*(nA+nB-1),(mA+mB-1)*(nA+nB-1))。

转化A1——堆叠向量式

将上个步骤转换的A1按照行向量顺寻依次转化为一个列向量,那么列向量的大小为((mA+mB-1)*(nA+nB-1),1)大小。

针对实例:具体代码为:

    周期延拓:

 转化A——>A1

  1. [m1,n1] = size(A);  [m2,n2] = size(B);
  2. m=m1+m2-1;n=n1+n2-1;
  3. AA = padarray(A,[m2-1,n2-1],'post');%%%补零
  4. BB = padarray(B,[m1-1,n1-1],'post');%%%补零
  5. AA =AA';
  6. A1 = AA(:);%%%%

 转化B——>B1

  1. B2(1,:) = BB(1,:);
  2. for i =2:m
  3. B2(i,:) = BB(m-i+2,:);
  4. end %%%矩阵a ~ e的重新赋值
  5. B4 = zeros(n,n);%%%%%%%每一行转化的方阵
  6. B1 = zeros(m*n,m*n);%%%%%最后的矩阵
  7. for i =1:m%%%%%%%%几维向量
  8. B = B2(i,:);
  9. if sum(sum(abs(B))==0)
  10. B4 = zeros(n,n);
  11. else
  12. for j = 1:n%%%%%%%元素
  13. for k =0:n-1%%%%%%%%位置(搞定一行向量转化为方阵的形式)
  14. t = mod(j+k,n);
  15. if t==0
  16. t = n;
  17. end  %%%end if
  18. B4(t,k+1) = B(j);
  19. end %%%end for
  20. end  %%%end for
  21. for  k =0:m-1%%%%%%%%每一个转换矩阵在大矩阵中的位置编号(搞定小方阵在大阵中的位置转化为大方阵的形式)
  22. t = mod(i+k,m);
  23. if t==0
  24. t = m;
  25. end  %%%end if
  26. B1(k*n+1:(k+1)*n,(t-1)*n+1:t*n) = B4;
  27. end  %%%end for
  28. end %%%end if else
  29. end  %%%end for

结果数据转化:

  1. Result = B1*A1;
  2. Result = reshape(Result,n,m);
  3. Result = Result';

得到的结果等同于conv2的数据结果:

   利用matlab接口更快的实现方法:
 
   还是以5 * 5的原始数据与3*3的卷积核为例子:
 
   代码如下:

  1. dd_data = [1,2,4,5,6;6,8,9,1,3;6,8,9,2,4;7,3,5,7,5;1,5,8,9,3]; % 5 *  5
  2. f_k = [3,4,5;6,7,8;3,2,1]; % 3 * 3
  3. dd_data_f_k = conv2(dd_data,f_k,'full'); % matlab 函数接口
  4. dd_data1 = padarray(dd_data,[2 2],'both'); % 扩充原始数据
  5. v_dd_data = im2col(dd_data1,[3 3]);% 块数据向量化
  6. f_k1 = f_k(:);
  7. f_k1 = f_k1(end : -1 :1);
  8. f_k1 = f_k1'; % 卷积核的表示
  9. dd_data_f_k1 = f_k1 * v_dd_data; % 卷积转化为相乘
  10. dd_data_f_k1 = reshape(dd_data_f_k1,[7 7]); % 转化为结果数据

矩阵卷积Matlab(转载)的更多相关文章

  1. Matlab 矩阵卷积理解(转载)

    转载自:http://blog.csdn.net/andrewseu/article/details/51783181 在图像处理的过程中,经常会看到矩阵卷积的概念,比如说用一个模板去和一张图片进行卷 ...

  2. 关于matlab矩阵卷积conv2和傅里叶变换求卷积ifft2的关系

    先定义两个矩阵 a = [1 2 3 5 ; 4 7 9 5;1 4 6 7;5 4 3 7;8 7 5 1] %a矩阵取5*4 b = [1 5 4; 3 6 8; 1 5 7]   %b矩阵如多数 ...

  3. 浅谈压缩感知(十四):傅里叶矩阵与小波变换矩阵的MATLAB实现

    主要内容: 傅里叶矩阵及其MATLAB实现 小波变换矩阵及其MATLAB实现  傅里叶矩阵及其MATLAB实现 傅里叶矩阵的定义:(来源: http://mathworld.wolfram.com/F ...

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

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

  5. 浅谈压缩感知(七):常见测量矩阵的MATLAB实现

    1.随机高斯测量矩阵 function [ Phi ] = GaussMtx( M,N ) %GaussMtx Summary of this function goes here % Generat ...

  6. 混淆矩阵在Matlab中PRtools模式识别工具箱的应用

    声明:本文用到的代码均来自于PRTools(http://www.prtools.org)模式识别工具箱,并以matlab软件进行实验. 混淆矩阵是模式识别中的常用工具,在PRTools工具箱中有直接 ...

  7. Matlab矩阵填充--Matlab interp2

    Matlab interp2 为Matlab的矩阵填充函数, 填充关系: x=1:11; y=1:13; x1=1:0.1:12; y1=1:0.1:14; [x2,y2]=meshgrid(x1,y ...

  8. 3D数学 ---- 矩阵和线性变换[转载]

    http://blog.sina.com.cn/s/blog_536e0eaa0100jn7c.html 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线 ...

  9. 纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章

    我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的.有着诸多对手竞争的领域上极为常见.比如吧,搞DirectX的人用了左手坐标 ...

随机推荐

  1. Mongodb Management Studio

    1.服务器管理功能添加服务器,删除服务器 2.服务器,数据库,表,列,索引,树形显示和状态信息查看 3.查询分析器功能.支持select,insert,Delete,update支持自定义分页函数 $ ...

  2. 【C语言学习】-04 一维数组、字符数组

    一维数组.数组排序.字符数

  3. POJ 3525 半平面交+二分

    二分所能形成圆的最大距离,然后将每一条边都向内推进这个距离,最后所有边组合在一起判断时候存在内部点 #include <cstdio> #include <cstring> # ...

  4. ClassLoader相关内容

    1.什么叫做bootstrap?作为形容词有依靠自己力量的:自己做的等意思,在我们计算机世界里,一般指的是自举,引导,引导程序. 那什么是bootstrapClassLoader呢?它是引导加载器,也 ...

  5. 使用generator自动生成mybatis model、mapper.xml、mapper等(转)

    原文链接:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件 ...

  6. Chrome 应用推荐 - 下载管理扩展: Chrono

    地址:http://goo.gl/JVdxvg Chrono下载管理器让你轻松高效地管理Chrome浏览器中的下载任务.Chrono与Chrome浏览器紧密地整合在一起,如菜单.工具栏支持等等.Chr ...

  7. iOS 使用两个tableview的瀑布流

    代码 悦德财富:https://www.yuedecaifu.com 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 ...

  8. C# Sandboxer

    public static string IsolateCallV1(PageContentHandler pHandler) { string name = Guid.NewGuid().ToStr ...

  9. WPF如何实现类似iPhone界面切换的效果(转载)

    WPF如何实现类似iPhone界面切换的效果 (version .1) 转自:http://blog.csdn.net/fallincloud/article/details/6968764 在论坛上 ...

  10. linux基础命令(二)用户管理和权限管理