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

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

时间: 2024-11-05 00:04:06

matlab练习程序(水波特效)的相关文章

matlab练习程序(毛玻璃模糊)

算是一种特效模糊方式吧,算法原理就是用邻域随机像素代替当前所处理的像素就可以了. 效果如下图所示: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); imgn=img; n=3; %模糊直径 for i=1:h for j=1:w offsetX=n*rand()-n/2; %邻域随机值代替当前像素 offsetY=n*rand()-n/2; y=floor(i+of

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

一款基于jquery实现的鼠标单击出现水波特效

今天要为大家绍一款由jquery实现的鼠标单击出现水波特效.用鼠标猛点击页面,你可以看到页面不断出面水波纹效果.然后水波纹渐渐消失.效果非常不错.我们一起看下效果图: 在线预览   源码下载 实现的代码. html代码: <div id="container"> <h1> Click or Touch the Screen.</h1> <p> Click as fast as you can. <em>Try it on a

matlab练习程序(弧形投影)

这个其实也算是圆柱体投影了,不过上一篇文章是从正面看,得到的是凸形的结果,而这个是从反面看,得到的是凹形的结果. 计算公式就不写了,大致介绍一下,计算公式中关于x坐标求法和上篇一样,y坐标则正好是上篇公式的反变换,结合上篇公式代码和本篇的代码,应该都不是很难理解的. 下面是hfOV为pi/2时得到的变换结果: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV

(转)matlab练习程序(HOG方向梯度直方图)

matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图如下(这篇论文上的): 下面我再结合自己的程序,表述一遍吧: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.

【转载】matlab练习程序(图像Haar小波变换)

matlab练习程序(图像Haar小波变换) 关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列的不同尺度的小波去分解原函数,变换后得到的是原函数在不同尺度小波下的系数. 不同的小波通过平移与尺度变换分解,平移是为了得到原函数的时间特性,尺度变换是为了得到原函数的频率特性. 小波变换步骤: 1.把小波w(t)和原函数f(t)的开始部分进行比较,计算

matlab练习程序(波纹扭曲)

其实就是用sin或cos对x,y坐标进行变换,处理的时候依然是反向变换. 类似的,用不同的函数能得到不同的扭曲效果,比如log,1/x,exp等等. 效果如下: 代码如下(还给出了如何生成gif图片的代码): clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); wave=[10,100]; %[幅度,周期] newh=h+2*wave(1); neww=w+2*wave(1); rot=0; for i=1:10 i