码迷,mamicode.com
首页 > 其他好文 > 详细

matlab练习程序(水波特效)

时间:2018-12-14 21:10:01      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:blank   down   函数   计算   a20   art   style   class   就是   

还记得原来写过一个对图像进行波纹扭曲操作的博文

这次实现的是水波特效,其实就是通过正余弦函数表示波纹中心位置慢慢向外扩散,通过叠加衰减因子使振幅不断减小,进而产生水波的效果。

效果如下:

原图:

技术分享图片

波纹特效:

技术分享图片

matlab代码如下:

clear all;
close all;
clc;

cenH=128;       %波纹中心
cenW=128;
R=80;           %扩散半径
amplitude =3;   %幅度
wavelength=30;  %波长
phase =20;      %相位

img = double(imread(lena.jpg));
imshow(img,[])
[H, W] = size(img);

imgn=zeros(H,W);
ii=1;
jj=1;
for i=1:H
   for j=1:W 
       dy = i-cenH;
       dx = j-cenW;
       dis=dx*dx+dy*dy;
       if dis>R*R || dis==0
          pix=[i j];         
       else
            dis=sqrt(dis);
            amount= amplitude * sin(dis/wavelength * 2*pi - phase);
            amount = amount*(R-dis)*wavelength/(R*dis);
            ii=(i+dy*amount);
            jj=(j+dx*amount);           
 
            if ii<=1
               ii=1; 
            end           
            if jj<=1
               jj=1; 
            end             
            if ii>=H
               ii=H ;
            end            
            if jj>=W
                jj=W;
            end                
            pix=[ii jj];
       end
                
       float_Y=pix(1)-floor(pix(1)); 
       float_X=pix(2)-floor(pix(2));  
       
       pix_up_left=[floor(pix(1)) floor(pix(2))];          %四个相邻的点
       pix_up_right=[floor(pix(1)) ceil(pix(2))];
       pix_down_left=[ceil(pix(1)) floor(pix(2))];
       pix_down_right=[ceil(pix(1)) ceil(pix(2))]; 
       
       value_up_left=(1-float_X)*(1-float_Y);              %计算临近四个点的权重
       value_up_right=float_X*(1-float_Y);
       value_down_left=(1-float_X)*float_Y;
       value_down_right=float_X*float_Y;       
       
       imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
                 value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
                 value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
                 value_down_right*img(pix_down_right(1),pix_down_right(2));
   end
end

figure;
imshow(imgn,[])
imwrite(mat2gray(imgn),imgn.jpg)

参考:https://blog.csdn.net/jia20003/article/details/13159535

matlab练习程序(水波特效)

标签:blank   down   函数   计算   a20   art   style   class   就是   

原文地址:https://www.cnblogs.com/tiandsp/p/10121479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!