转载自: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. JavaScript 在函数中使用Ajax获取的值作为函数的返回值

    解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...

  2. 简单探索ContentProviderOperation

    前面一片文章中用到了ContentProviderOperation,那么我们就来看看ContentProviderOperation到底是怎么工作的. 1. ContentProviderOpera ...

  3. [开发笔记]-多线程异步操作如何访问HttpContext?

    如何获取文件绝对路径? 在定时器回调或者Cache的移除通知中,有时确实需要访问文件,然而对于开发人员来说, 他们并不知道网站会被部署在哪个目录下,因此不可能写出绝对路径, 他们只知道相对于网站根目录 ...

  4. HDU 3336 扩展kmp

    题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模 ...

  5. java.io.IOException: open failed: EACCES (Permission denied)问题解决

    1.  问题描述:在Android中,用程序访问Sdcard时,有时出现“java.io.IOException: open failed: EACCES (Permission denied)&qu ...

  6. 在hibernate中用sql语句

    在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.adden ...

  7. Html.ActionLink , Url.Action

    也来总结一下 以后省的忘了 都是从controller中获取到action名字返回 html.actionlink 返回的是带<a> 标签的超链接 url.action 是返回正常cont ...

  8. pyMagic:用python控制的Geek入门神器

    大学四年快要结束了,这几年也学习了一点新的姿势.最近一直在跟国外的micropython项目,这个项目是由剑桥大学的理论物理学家(theoretical physicist)Damien George ...

  9. Python 的property的实现 .

    描述符.就是 将某种特殊类型①的类的实例指派给另一个类的属性 ①只要实现一下三种方法的其中一个就是特殊类型. __get__(self,instance,owner) -用于访问属性,他返回属性的值. ...

  10. node 学习笔记

    以下笔记默认安装完成node 及npm 1.安装express 新版本的express-generator已经独立出来,全局安装这个包就ok. npm install express-generato ...