[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及效果图