zoukankan      html  css  js  c++  java
  • 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')

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

     打开微信扫一扫哦!

  • 相关阅读:
    CSUST 4005-你真的会!(分治思维+线段树)
    CSUST 4007-你真的会图论吗?(思维-三元环)
    CSUST 4002-你真的会字符串吗?(DP)
    Odoo下拉动作列表
    Odoo Shell
    Odoo report
    Odoo Web Service API
    Odoo启动过程
    Odoo10 变化
    Odoo10尝鲜:出勤登记
  • 原文地址:https://www.cnblogs.com/52geek/p/10128165.html
Copyright © 2011-2022 走看看