四、凸透镜效果算法

四、凸透镜效果算法


      所谓凸透镜效果,就是相当于你通过凸透镜所得的视觉效果。


    在我看来,凸透镜效果的本质是一种插值算法——透镜中心的物体得到一定的放大,相应的,边缘处被压缩,并且在边缘处需要连续,才能使得图像看起来和谐自然。


    其算法如下图所示:


 由于本人表述能力有限,如果给大家造成困惑之处请多多谅解与交流。


    既然算法已经给出,现在所需要的就是找到一个映射函数,能够实现以上算法有关点的映射,幸运的是,很多函数,只要是凸函数,都可以实现以上功能,假设圆的半径为r。则相应的映射函数可为如下:




    这里我选择使用y=x^2/r,当然,求解映射坐标的时候,要采用逆向思维,所谓逆向思维,就是对于给定处理后的点,找出它所在原图像的位置,再把原图像该点的值赋值给处理后图像相对于的点(请您仔细体会)!相应的matlab代码如下:

  

 

img=imgread('1.jpg');
info_size=size(img);
height=info_size(1);
width=info_size(2);
spec_img=zeros(height,width,3);
imshow(img);
figure();
%%%%%%%%%%%%%%x(i,j)
cen_x=width/2;
cen_y=height/2;
radius=150;%%%%%you can change it!!!!!!R!!!!!
radius=min(cen_x,cen_y);
for i=1:height
    for j=1:width
        
        distance=(j-cen_x)*(j-cen_x)+(i-cen_y)*(i-cen_y);
	%%%%% r^2=(j-cen_x)*(j-cen_x)+(i-cen_y)*(i-cen_y)!!!!!
	dis=distance^0.5;       
        spec_img(i,j,:)=img(i,j,:);       
        if(distance<=radius^2)                      
           new_j=floor( dis*(j-cen_x)/radius+cen_x);       
           new_i=floor(  dis*(i-cen_y)/radius+cen_y);       
           spec_img(i,j,:)=img(new_i,new_j,:);       
        end                    
    end
end 
imshow(spec_img/255);


 


处理后:


呵呵,凹透镜的效果呢?????????相比大家也马上有了感觉了吧!!!
    水波等等的效果呢??????????????哈哈!!!!!

欢迎朋友们指教,欢迎分享并且注明出处。

http://blog.csdn.net/wsfdl



你可能感兴趣的:(Digital,Image,Processing)