[MATLAB]Debut-不知名的线性变换

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

1.问题分析

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

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

对这个矩阵做如下运算

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

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

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

另,注意到

$\begin{equation}
det\left( D' \right)=
\left( k+2 \right)*
\left( k+3 \right)
\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及效果图

posted @ 2016-12-09 18:34  CN_LHC  阅读(208)  评论(0编辑  收藏  举报