保捱科技网
您的当前位置:首页猫脸变换

猫脸变换

来源:保捱科技网


有一种数学变换被称作猫脸变换,意思是说用给定的规则,对一幅正方形的猫脸图像进行迭代变换,渐渐地猫脸变得一塌糊涂,但是不停地迭代,若干次以后,猫脸总会恢复成原先的模样。下面演示的是一幅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次变换后的猫脸

因篇幅问题不能全部显示,请点此查看更多更全内容