问题简述
这是信号与系统课程的一个课后作业,要求运用傅里叶变换的理论知识,在matlab中对数字图像进行浮雕效果的处理。
浮雕效果和图像边缘的检测差不多,学习过深度学习的同学可能会想到使用核对图像进行卷积操作,吴恩达老师在DeepLearning.ai系列课程中有相应的讲解。B站传送门
目前网络上绝大多数做法都是图像卷积的做法或是直接在时域内操作,但这里老师要求使用《信号与系统》课程中傅里叶变换的相关知识对图像进行处理,并提示在时域中用一阶微分算子实现。
知识点回顾
哗啦啦啦翻书~
离散时间系统的傅里叶变换(DFT)定义为:
提到一阶微分,我们可以想到傅里叶变换中很重要的一条性质——时域微分特性,这里直接给出公式,具体证明这里不进行赘述:
到此为止,浮雕效果的生成所需的所有公式都已经给出,但是既然我们处理的是图像,那我们就需要从一维过渡到2维
公式看起来分吓人,其实就是先对x方向逐行进行傅里叶变换,再对y方向逐列进行傅里叶变换而已,图2中的公式也可以推广至此处,但是使用时注意求偏导的方向。
操作代码
function [final_image] = rilievo_filter(image, no_channel, k)
%image 输入的图像矩阵
%no_channel输入图像矩阵的通道数,灰度图为1, rgb图片为3
%
[h, w,~] = size(image); %获取图像的维度信息
fy = linspace(floor(-h/2)+1,floor(h/2),h);
fy = fy’/h2pi*1i; %每一列对应的jw_y
fx = linspace(floor(-w/2)+1,floor(w/2),w);
fx = fx/w2pi*1i; %每一行对应的jw_x
final_image = zeros(size(image));
for i = 1:no_channel %分通道操作
s = double(image(:,:,i));
f = fftshift(fft2(s)); %对i通道进行傅里叶变换并将低频移到图像中心
df_y = f.*(1-exp(-fy)); %时域求y方向差分
df_x = (1-exp(-fx)).*f; %时域求x方向差分
df = df_x+k*df_y; %x方向与y方向的梯度图像加权叠加=x方向与y方向处理后的频谱图像加权叠(由于后期有中心化操作,所以这里控制好比例就可以)
%调节xy分量的权重可以调节效果图中的光照方向
final_image(:,:,i)=real(ifft2(ifftshift(df)));
end
final_image = double(final_image)./(max(final_image)-min(final_image))*255.0+128.0; %中心化与规范化
final_image = uint8(final_image);
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
成果展示
展示一下处理效果:(小声:Bill超可爱有木有!)
改变k的取值,可以改变光照效果与图片的凹凸效果:
对比一下photoshop中的浮雕效果(飘了飘了~)
欢迎各位大佬批评指正,若有帮助也请点个赞