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

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

  • 相关阅读:
    04: Dom
    03: JavaScript基础
    02: css常用属性
    01: html常用标签
    03: Memcached
    01: Redis缓存系统
    01: RabbitMQ
    04: 事件驱动、五种I/O操作、I/O多路复用select和epoll
    03: 进程、线程、协程
    [Android] 任意时刻从子线程切换到主线程的实现
  • 原文地址:https://www.cnblogs.com/tiandsp/p/10121479.html
Copyright © 2011-2022 走看看