2014-11-16 105 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

它仍然看起來不正確。

我甚至在Google上搜索了一些類似的案例python here,關於動畫。但我只想要一個固定的效果。

Q1如何提高效果?

Q2如何將它應用於現有圖像?

感謝,

回答

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; 

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,查看更新回答 –