我想编写一个函数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]
,它有点好转,
它似乎仍然不对。
我甚至用Google搜索并在python here中找到了一些关于动画的类似案例。但我只想要一个固定的效果。
Q1 如何改善效果?
Q2 如何在现有图片上应用它?
谢谢,
答案 0 :(得分: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);
答案 1 :(得分:2)
我终于找到了答案。我正在寻找的,可以通过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;