Image MATLAB中的涟漪效应

Image MATLAB中的涟漪效应,image,matlab,image-processing,image-effects,Image,Matlab,Image Processing,Image Effects,我想编写一个函数newim=rippleim(im),它获取一个图像并返回一个带有涟漪效应的新图像 我认为从(p,q)计算所有点的距离,然后乘以sin(d)。*exp(-d)会产生很好的衰减波效果 n = 800; m = 800; im = zeros(n,m,3); p = [round(m*.5) round(n*.5)]; [x y] = meshgrid(1:m,1:n); x = x - p(1,1); y = y - p(1,2); d = (x .^2 + y .^2).^.5;

我想编写一个函数
newim=rippleim(im)
,它获取一个图像并返回一个带有涟漪效应的新图像

我认为从
(p,q)
计算所有点的距离,然后乘以
sin(d)。*exp(-d)
会产生很好的衰减波效果

n = 800;
m = 800;
im = zeros(n,m,3);
p = [round(m*.5) round(n*.5)];
[x y] = meshgrid(1:m,1:n);
x = x - p(1,1);
y = y - p(1,2);
d = (x .^2 + y .^2).^.5;
R = cos(.05*d) .* exp(-.005*d);
G = cos(.05*d) .* exp(-.005*d);
B = cos(.05*d) .* exp(-.005*d);
im = cat(3,R,G,B);
imshow(im);
我得到了

标准化为
[0 1]
后,情况有所好转

看起来还是不对

我甚至在谷歌上找到了一些类似的python动画案例。但我只想要一个固定的效果

Q1如何提高效果

Q2如何将其应用于现有图像


谢谢,

关于问题的第一部分,我建议您手动创建一个您心目中的查找表“函数”,然后为其拟合一个高阶多项式,而不是通过反复试验来找到一个适合您口味的函数

关于你的第二部分,我猜你的意思是把它当作面具。 在这种情况下,您可以简单地将ripple effect的规范化版本乘以您的图像:

imp = double(imread('peppers.png'));
n = size(imp,1);
m = size(imp,2);
p = [round(m*.5) round(n*.5)];
[x,y] = meshgrid(1:m,1:n);
x = x - p(1,1);
y = y - p(1,2);
d = (x .^2 + y .^2).^.5;
mask = cos(.05*d) .* exp(-.005*d);
im = (mask-min(mask(:)))./ ( max(mask(:))-min(mask(:)));
I = bsxfun(@times,im,imp);
imshow(I/255);

我终于找到了答案。我所寻找的,可以通过
warp
命令来完成

因此,我在
cos(d)*exp(-d)
的帮助下定义了一个3D波纹曲面,并在其上对图片进行纹理处理

im = imread('peppers.png');
n = -10 : .1 : 10;
[X,Y] = meshgrid(n,n);
d = (X .^ 2 + Y .^ 2) .^ .5;
Z = cos(1.5 * d) .* exp(-.1 .* d);
warp(X,Y,Z,im);axis equal;axis off;

谢谢。对效果有什么建议吗?一些比sin*exp更自然的公式?再次感谢。很抱歉没有接受答案。也许我在这个问题上不够清楚。我希望能弥补你的损失。