有了参加建模竞赛的想法后,断断续续的学了一阵Matlab,始终没做出什么好玩的东西..恰好今天上高等代数课时,杨家忠教授提到说他中午在休息室里倒腾一个特殊的矩阵。貌似和图像处理有点关系,于是乎下课后就尝试拿Matlab来实现一下这个简单的线性变换。(算是MATLAB处女作了…)
1.问题分析
杨教授提到的矩阵就是这个..我倒是没看出什么特别之处,显然是因为我数学水平还是太太太太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及效果图