转载自: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. iOS https(SSL/TLS)数据捕获

    要捕获iPhone上的appstore的数据还真的没那么容易,以前介绍的那些使用代理手工导入证书的方法已经完全失效了,结果就是安装证书之后再打开appstore也无法正常的建立连接.按照我的分析其实是 ...

  2. EditorLineEnds.ttr 错误问题

    安装 Windows Write Live,在线安装,会先安装一个什么补丁,中途提示失败. 运行Delphi2007,第一次成功,第二次就是 EditorLineEnds.ttr文件错误. http: ...

  3. switch… case 语句的用法(二)

    总结来说:switch的用法是判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break.都不匹配找d ...

  4. Visual Studio 2015 预览版 - 支持跨平台开发Android/iOS应用程序(内置安卓模拟器)

    微软最近的惊人举动真多,对普通消费者Office 移动版宣布免费,对开发者也发布了完全免费的 VS2013 社区版! 不仅如此,就连 .Net 开发框架环境也竟然「开源」并且跨平台支持 Mac 及 L ...

  5. sql 之CONCAT用法

    这是java交流群里一个网友面试的时候发过来的笔试题,我觉得题目的假定条件应该是某个字母对应的最小数字只有一个. 思路第一步是查出一个子表s1: select name,min(number) fro ...

  6. 根据username查找user

    返回的是一个list<User>,不过验证密码的时候,要求返回是一个user对象,如果用uniqueresult,这个是过时的方法,如果用getResultList 会得到一个列表,get ...

  7. T-sql语句

    在用代码编辑数据库时,首先要启动WAMPSERVER 1.创建表 create table Car ( Code varchar(50) primary key , Name varchar(50) ...

  8. Java基础毕向东day04

    1. 数组 2.选择排序.冒泡排序.折半查找.

  9. FSMC stm32

    1.FSMC机制 FSMC(Flexihie Static Memory Controller,可变静态存储控制器)是STM32系列中内部集成256 KB以上FlaSh,后缀为xC.xD和xE的高存储 ...

  10. PHP图像处理之画图

    PHP图像处理    画图        验证码,统计图 安装GD库-----LAMP            安装后在D:\APMServ5.2.6\PHP\ext文件中有php_gd2.dll文件  ...