2010年7月16日星期五

玩具,3D眼镜,做图

今天买了个红蓝眼镜玩。于是想起了以前的一个题目。重新做一下玩。
玩法是这样的:
1. 生成2副随机点图
2. 做一个低通滤波器,把高频部分过滤掉。
3. 取一个数字图片,作为前景图片。分别做两张图,背景是黑色,前景是白色数字,但位置略微错开。
4. 黑色背景的部分用一个随机点图,白色前景部分,用相同位置的随机点图
于是生成了如下的图像:

左眼:
右眼:

用个小软件:http://www.stereoeye.jp/index_e.html 制作立体图片:
双眼合成为灰度图像,此时用红蓝(red-cyan)眼镜观看,

还是用那个软件,这次生成彩色图像。
带上红蓝眼镜,哦。。我看不出来数字了。

哪位帮我彩色打印下,放在同视机里看看?

这个实验以前做过类似的,本次的改进之处在于:
1. 用低通滤波器,生成色块。实验几次也有好玩的事,就是如果低通滤波器的阈值太低,就无法分辨出数字了。猜想可能是阈值已经低于我给出的数字图案了。
1.5 用滤波器来控制频率,似乎可以不用管伪分辨之类的问题。也不用考虑边缘效应。因为反正随机和随机之间是无法分辨的。
2. 生成了个彩色的图像。这是借助软件的。另外red-cyan镜片的效果好差。想不明白,生成彩色了以后,为什么就没有立体像了呢?如果在同视机上也引不出来,而用黑白图像能引出来的话,就是个很诡异的现象了。
我记得有人曾经引用RDS(随机点立体图)来说,认为立体觉是发生在形状识别之前的,怀疑中。

==随手写的难看程序==

% 那个numpic是我实现做好的。
比如
下面是源程序,matlab7.2测试通过。

% make stero 
clear all
close all
leftimg=zeros(450,750);
rightimg=zeros(450,750);
for i=1:10
    filename=[num2str(i-1) '.tif'];
    numpic=imread(filename);
    nums(:,:,i)=im2bw(numpic(:,:,2));
end
n=ceil(10.*rand);
% n=6
leftimg(:,145+1:145+450)=(nums(:,:,n));
rightimg(:,155+1:155+450)=double(nums(:,:,n));
lowpass=zeros(450,750);
lowpass(450/2,750/2)=1;
rlowpass=bwdist(lowpass);
r=30;
lowpass((rlowpass)<=r)=1;

for j=1:3
back=rand(450,750);
back=abs(ifft2(fftshift(fft2(back)).*lowpass));

front=rand(450,750);
front=abs(ifft2(fftshift(fft2(front)).*lowpass));

front2=front(1:450,1:450);
frontleft=front;
frontright=front;
frontleft(:,145+1:145+450)=front2;
frontright(:,155+1:155+450)=front2;

limg=(1-leftimg).*back+leftimg.*frontleft;
rimg=(1-rightimg).*back+rightimg.*frontright;

limgcolor(:,:,j)=imadjust(abs(ifft2(fftshift(fft2(limg)).*lowpass)));
rimgcolor(:,:,j)=imadjust(abs(ifft2(fftshift(fft2(rimg)).*lowpass)));

end
imwrite(limgcolor,'left.bmp');
imwrite(rimgcolor,'right.bmp');

Posted via email from goldengrape's posterous

没有评论:

发表评论