浮雕效果之傅里叶变换
一、工作原理
先将图片矩阵化,对不同的通道分别进行二维傅里叶变换。二维离散傅里叶变换是将图像从空间域转换到频域的变换方法。图像实质上是二维的数表或矩阵。将空间域(二维灰度数表)的图像转换到频域(频率数表)能够更直观地观察和处理图像,也更有利于进行频域滤波等操作。二维离散傅里叶变换的公式如图。
式中 f(x,y) 代表一幅大小为 M x N 的矩阵,其中 x = 0,1,2,···,M-1 和 y = 0,1,2,···,N-1 ,F(u,v) 表示 f(x,y) 的傅里叶变换。可以转换为三角函数表示方法,其中 u 和 v 可用于确定正余弦的频率。 F(u,v) 所在坐标系被称为频域,由 u = 0,1,2,···,M-1 和 v = 0,1,2,···,N-1 定义的 M x N 矩阵常称为频域矩阵。f(x,y) 所在坐标系被称为空间域, 由 x = 0,1,2,···,M-1 和 y = 0,1,2,···,N-1 所定义的 M x N 矩阵常被称为空间域矩阵。显然频域矩阵的大小与原空间域矩阵大小相同。频域矩阵中每个点的都代表了一个频率为 u,v 的函数,这些函数在空间域的组合即为原函数 f(x,y)。
随后在时域上对x、y方向上进行差分后再叠加,最后让所得矩阵借助不同的灰度等级将其逐步调节即可展现为浮雕效果。
二、matlab源代码
function final_image=relief(image,no_channel) %no_channel:灰度图为1, rgb图片为3
[h,w,~]=size(image);
fx=linspace(floor(-w/2)+1,floor(w/2),w);
fx=fx/w*2*pi*1i;
fy=linspace(floor(-h/2)+1,floor(h/2),h);
fy=fy'/h*2*pi*1i;
final_image=zeros(size(image));
for i=1:no_channel
s=double(image(:,:,i));
f=fftshift(fft2(s));
df_y=f.*(1-exp(-fy));
df_x=(1-exp(-fx)).*f;
df=df_x+df_y;
final_image(:,:,i)=real(ifft2(ifftshift(df)));
end
final_image=uint8(final_image+128);
imshow(rgb2gray(final_image))
end
三、成果展示