Волновой эффект в MATLAB
Я хочу написать функцию 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 Как применить его к существующему изображению?
Спасибо,
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;
Что касается вашей первой части вопроса, вместо того, чтобы искать функцию, которая соответствует вашему вкусу методом проб и ошибок, я предлагаю вам вручную создать вручную "функцию" справочной таблицы, а затем установить высокий порядок полином к нему.
Что касается вашей второй части, я предполагаю, что под "применением" вы подразумеваете использование ее в качестве маски. В этом случае вы можете просто умножить нормализованную версию эффекта ряби на ваше изображение:
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);