問題簡述
這是信號與系統課程的一個課後作業,要求運用傅里葉變換的理論知識,在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'/h*2*pi*1i; %每一列對應的jw_y
fx = linspace(floor(-w/2)+1,floor(w/2),w);
fx = fx/w*2*pi*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
成果展示
展示一下處理效果:(小聲:Bill超可愛有木有!)
改變k的取值,可以改變光照效果與圖片的凹凸效果:
對比一下photoshop中的浮雕效果(飄了飄了~)
歡迎各位大佬批評指正,若有幫助也請點個贊