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

matlab练习程序(水波特效)

时间:2018-12-16 23:30:04      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:make   too   val   就是   位置   ima   www.   波特   一个   

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

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

效果如下:

原图:

技术分享图片

波纹特效:

技术分享图片

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‘)

关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉

技术分享图片

 打开微信扫一扫哦!

matlab练习程序(水波特效)

标签:make   too   val   就是   位置   ima   www.   波特   一个   

原文地址:https://www.cnblogs.com/52geek/p/10128165.html

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