4

我想编写一个函数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如何将它应用到现有图像上?

谢谢,

4

2 回答 2

4

关于您的问题的第一部分,我建议您手动手动创建您想到的查找表“功能”,而不是通过反复试验找到适合您口味的功能,然后适合高阶它的多项式。

关于你的第二部分,我猜你的意思是用它作为面具。在这种情况下,您可以简单地将标准化版本的波纹效果乘以您的图像:

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

在此处输入图像描述

于 2014-11-16T08:11:38.130 回答
2

我终于找到了我的答案。我一直在寻找的东西,可以通过warp命令来完成。

所以我在它的图片的帮助下定义了一个 3D 波纹表面cos(d)*exp(-d)并为其添加纹理。

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;

在此处输入图像描述

于 2014-11-20T19:33:34.113 回答