转载自: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. SQL语句的用法

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  2. 转: CSS中float和clear的理解

    float:浮动,比如,默认的,我们知道,div是占满一行的,现在我们想把两个div显示在一行上,那怎么办呢<div style="width:100px;">1111 ...

  3. php解密java的DES加密

    echo openssl_decrypt( $密文 ,"des-ecb" , $密钥 );

  4. arm-linux-gcc-4.3.2安装步骤

        安装交叉编译工具链: 1.首先以root用户登入 2.复制arm-linux-gcc-4.3.2.tgz到根目录下tmp文件夹里 3.解压命令tar xvzf arm-linux-gcc-4. ...

  5. centos=>gsutil,iptables

    sudo apt-get remove --purge gsutil sudo easy_install -U pip  sudo pip2 install gsutil gsutil ls gs:/ ...

  6. POJ 3264 Balanced Lineup 线段树 第三题

    Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...

  7. Java基础01 ------ 从HelloWorld到面向对象

    Java是完全面向对象的语言.Java通过虚拟机的运行机制,实现“跨平台”的理念.我在这里想要呈现一个适合初学者的教程,希望对大家有用. "Hello World!" 先来看一个H ...

  8. 有哪些 PHP 调试技巧?

    我目前遇到的最让我称赞的debug方式是:xdebug的 xdebug_start_trace(); /* 业务代码 */ xdebug_stop_trace(); 他解决了我长久以来一个代码调试问题 ...

  9. 第八章 标准IO库

    1.IO对象时不可复制或者赋值的:也就是说形参或者返回类型也不能为流类型.如果非要传递或者返回IO对象的的话,则必须传递或者返回指向对象的指针或者引用.如:  ofstream &print( ...

  10. Android布局— — —帧布局

    帧布局,开发中很少使用,最简单的布局 添加多个控件,这些控件会按顺序在屏幕左上角重叠显示,且会透明显示之前控件的文本语法格式:<?xml version="1.0" enco ...