有一种数学变换被称作猫脸变换,意思是说用给定的规则,对一幅正方形的猫脸图像进行迭代变换,渐渐地猫脸变得一塌糊涂,但是不停地迭代,若干次以后,猫脸总会恢复成原先的模样。下面演示的是一幅100×100的256色猫脸图象,第1、2、50、149、150次迭代变换后的图像分别如图所示,可以看出经过150次的迭代,猫脸又变回来了。
人们不但用猫脸的变化来作为这种数学变换的感官说明,而且在很多书中都使用法国大科学家庞加莱的头像来演绎这种变换,这是为了纪念他的伟大发现:如果反复地对一个数学系统施加变换,而且这个系统不能脱离一个有界区域,则它必无限频繁地回到接近它的初始状态。这就是猫脸变换的数学内涵。
假设猫脸上任意像素的位置是xcord和ycord,利用下面的式子计算:
newxcord=xcord+ycord (mod n)
newycord=xcord+ycord*2 (mod n)
newxcord、newycord则是经过一次猫脸变换以后这一像素新的位置。上式中 mod n 表示将计算结果除以n得到的余数,n是图像的宽度和高度。下面的程序用matlab编写。
function catface(imgfile,nlength,ntimes)
%猫脸变换程序,输入参数imgfile指定图像文件名称
%nlength指定图像的大小,ntimes指定迭代次数
figdata=imread(imgfile);
%读取图像数据到数组figdata
imginfo=imfinfo(imgfile);
%读取图像信息
tmpdata=figdata;
%将图像数据存入临时数组
for m=1:ntimes
for i=1:nlength
for j=1:nlength
newi=i+j; %迭代计算
if newi>nlength
%为了提高计算速度,用这种方法求模
newi=newi-nlength;
end
newj=newi+j;
if newj>nlength
newj=newj-nlength;
end
figdata(newi,newj)=tmpdata(i,j);
end
end
tmpdata=figdata; %将临时数组中的数据设为当前图像数据
end
colormap(imginfo.colormap); %指定调色板
image([0,nlength],[nlength],figdata); %显示变换后的图像
本文开始的猫脸图像是100×100的256色图像,其文件名称是“catface.bmp”,如果需要显示经过1次变换后的图像,只需在matlab中输入命令:
catface('cafface.bmp',100,1)。matlab是一门高效易用的计算语言,其程序很容易转换成c语言。
任意的图像经过类似的迭代变换以后总能回到最初的状态,但是不同大小的图像所需要迭代的次数不同,这方面的问题可以参看有关的论著。
原始猫脸
1次变换后的猫脸
2次变换后的猫脸
50次变换后的猫脸
149次变换后的猫脸
150次变换后的猫脸