Matlab编程遇到灵异事件。可重复性的灵异事件。
这事不能只吓唬我一个人,大家都要分享一下。以下现象在Matlab 7.0 for Mac上实现:
clear all
close all
%清除工作区,关闭所有图片窗口,注意,我已经清除了工作区了!所有的变量默认值都应该是空
near=imread(’I1.tif’);
far=imread(’I2.tif’);
near=rgb2gray(near);
far=rgb2gray(far);
imagepic=far;
%读取两个图片文件,转换成黑白,交给一个变量imagepic,注意变量名是imagepic,不是image
[lens_sizex,lens_sizey]=size(near);
D=zeros(lens_sizex,lens_sizey);
% 建立一个尺寸与读取图形大小一样的0矩阵
centerx=floor(lens_sizex/2)+1;
centery=floor(lens_sizey/2)+1;
D(centerx,centery)=1;
% 取0矩阵的中心点=1
R=bwdist(D);
% 以欧氏距离返回各点到1点的距离,也就是说(x,y)点的值=半径,相当于直角坐标系转换成极坐标系。
for DefocusInDiopters=2;
% 这个for循环在Matlab中是允许的,相当于for i=2 to 2.
PARAMS3=6;
c4=(1/(4sqrt(3)))DefocusInDiopters*((PARAMS3/2000)^2);
wavefront=c4sqrt(3)((2)R.R+(-1)*R.^0);
% Zernike函数的转换,没啥特殊,把第四项离焦的像差计算出来
pupilfunc=exp(-i2pi/0.550.*wavefront);
Hamp=fft2(pupilfunc);
Hint=(Hamp .* conj(Hamp));
PSF = real(fftshift(Hint));
%计算离焦产生的点扩散函数
wnr1 = deconvwnr(image,PSF);
%用图像处理工具箱之中的维纳滤波复原,试图使用离焦的点扩散函数复原图像
%注意!!这里拼写错误,应该使用imagepic,而写成了image,image应该是没有定义的!!!
figure;imshow(wnr1);
%显示图像
end
显然程序报错:
??? Error using ==> deconvwnr>parse_inputs
In function deconvwnr, input image must have at least two elements.
Error in ==> deconvwnr at 82
[I, PSF, ncorr, icorr, sizeI, classI, sizePSF, numNSdim] = …
Error in ==> main at 46
wnr1 = deconvwnr(image,PSF);
但是,居然还是显示出了图像。下面就是那个显示的结果,还好是一个比较可爱的男孩,降低了一些恐怖性。

从科学家的严谨性出发,我用imshow(image)单独显示image变量中的图像,是空的。
===
说说这个程序,如果可以根据PSF对图像复原,那么理论上,我可以计算出一个离焦的PSF,然后对一张照片复原,于是获得在另一个焦距上的图像,这事也比较离谱,也就是说可以将焦点设定在近处,而获得焦点在远处的成像。这就是所谓的数码变焦么?问题是,这好像和MTF之中截止频率的定义相矛盾,高于截止频率的信息是没有被传递过来的,而却有可能被还原出来。很迷惑。继续,考虑信息量的传递,成像过程相当于做卷积,那么卷积过程中是否会损失信息量?
可以扩展一下函数对信息量的影响的定义。有些函数或者运算是不影响信息的传递的,比如加法、减法,而有些会降低信息量,比如取整。那么卷积呢?
这是near和far的两张图


New blog post: Matlab编程遇到灵异事件。可重复性的灵异事件。 http://tinyurl.com/auwr2d
This comment was originally posted on Twitter