[MATLAB]Debut-不知名的线性变换 1.问题分析 2.代码实现 3.后记

有了参加建模竞赛的想法后,断断续续的学了一阵Matlab,始终没做出什么好玩的东西..恰好今天上高等代数课时,杨家忠教授提到说他中午在休息室里倒腾一个特殊的矩阵。貌似和图像处理有点关系,于是乎下课后就尝试拿Matlab来实现一下这个简单的线性变换。(算是MATLAB处女作了…)

杨教授提到的矩阵就是这个..我倒是没看出什么特别之处,显然是因为我数学水平还是太太太太low

$egin{equation}
D=left(
egin{matrix}
1&2&\
-1&4&\
end{matrix}
ight)
end{equation}
$

对这个矩阵做如下运算

$egin{equation}
D'=left( k*E +
left[
egin{matrix}
1&2&\
-1&4&\
end{matrix}
ight]
ight)=
left[
egin{matrix}
1+k&2&\
-1&4+k&\
end{matrix}
ight]
end{equation}$

对图像坐标数据做如下线性变换。据说改变K值就会有好玩的现象出现

$egin{equation}
left[
egin{matrix}
x'&\
y'&\
end{matrix}
ight]=
left[
egin{matrix}
1k&2&\
-1&4k&\
end{matrix}
ight]*
left[
egin{matrix}
x&\
y&\
end{matrix}
ight]
end{equation}
$

另,注意到

$egin{equation}
detleft( D' ight)=
left( k+2 ight)*
left( k+3 ight)
end{equation}
$

k=-2和k=-3时应该会有有趣的事情发生…

目标是对北航校徽进行如上线性变换…实现方法如下

  • 读取一张logo.jpg(北航校徽)
  • 将图片二值化,得到一个logical类型的268*268矩阵(由图像大小决定)
  • 遍历该矩阵,读取False点,构造两个坐标向量分别对应x轴/y轴坐标
  • 利用for循环,以0.1为步长依次转换-绘制,配合Pause得到动态图

2.代码实现

A=[1,2;-1,4];
E=[1,0;0,1];
imgRgb =imread('logo.jpg');
thresh = graythresh(imgRgb); 
I2 = im2bw(imgRgb,thresh);
pos=[0;0];
hold off  
for i=1:1:268
    for j=1:1:268
        if I2(i,j)==0
            pos=[pos,[i;j]];
        end
    end
end
 for h=11:-0.1:-10
   R=(h*E+A)*pos;
   p=plot(R(1,:),R(2,:),'.');
    axis equal
   legend(strcat('h=',num2str(h)))
   pause(0.001);
end

3.后记

高等代数确实很有意思…华章教育Leon那本线性代数教材上讲了不少高代的有趣应用,够玩儿好一阵呢..

Ps:本文中的数学公式由著名的Latex编写而成.(Warning:学习Latex可能会导致学习者出现焦虑/狂躁等症状)

PPS:另附本代码中的测试图片logo.jpg及效果图

[MATLAB]Debut-不知名的线性变换
1.问题分析
2.代码实现
3.后记[MATLAB]Debut-不知名的线性变换
1.问题分析
2.代码实现
3.后记