matlab练习程序(水波特效)

Posted tiandsp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab练习程序(水波特效)相关的知识,希望对你有一定的参考价值。

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

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

效果如下:

原图:

技术分享图片

波纹特效:

技术分享图片

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练习程序(水波特效)的主要内容,如果未能解决你的问题,请参考以下文章

教你使用MATLAB制作水波倒影特效

教你使用MATLAB制作水波倒影特效

怎么用UE4制作物体触碰产生水波的特效? 或者如何制作通过触控才能出现的粒子特效??

数学建模基于matlab动态水波仿真含Matlab源码 2056期

数学建模基于matlab动态水波仿真含Matlab源码 2056期

85.CSS水波背景动画特效