2014-11-16 4 views
4

Я хочу написать функцию newim = rippleim(im), которая принимает изображение и возвращает новое изображение с эффектом пульсации на нем.Эффект пульсации в MATLAB

Я думал, вычисляя расстояние от всех точек от (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); 

И я,

enter image description here

с нормализацией к [0 1], это стало немного лучше,

enter image description here

Он по-прежнему не кажется правильным.

Я даже нашел googled и нашел некоторые подобные случаи в python here, о анимации. Но я просто хочу фиксированный эффект.

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; 

enter image description here

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

enter image description here

+0

+1 - Очень приятно! – rayryeng

+0

Спасибо. Любые предложения об эффекте? какая-то формула, которая могла бы дать более естественные результаты, чем 'sin * exp'? еще раз спасибо. – Rashid

+0

@ Kamtal, см. Обновленный ответ –

Смежные вопросы