Python?OpenCV實(shí)現(xiàn)圖像傅里葉變換
二維離散傅里葉變換(DFT)
對(duì)于二維圖像處理,通常使用 x , y x, yx,y 表示離散的空間域坐標(biāo)變量,用 u , v u,vu,v 表示離散的頻率域變量。二維離散傅里葉變換(DFT)和反變換(IDFT)為:

二維離散傅里葉變換也可以用極坐標(biāo)表示:

傅里葉頻譜(Fourier spectrum)為:

傅里葉相位譜(Fourier phase spectrum)為:

傅里葉功率譜(Fourier power spectrum)為:

空間取樣和頻率間隔是相互對(duì)應(yīng)的,頻率域所對(duì)應(yīng)的離散變量間的間隔為:Δu=1/MΔT, Δυ=1/NΔZ。即:頻域中樣本之間的間隔,與空間樣本之間的間隔及樣本數(shù)量的乘積成反比。
空間域?yàn)V波器和頻率域?yàn)V波器也是相互對(duì)應(yīng)的,二維卷積定理是在空間域和頻率域?yàn)V波之間建立等價(jià)關(guān)系的紐帶:

這表明 F 和 H 分別是 f 和 h 的傅里葉變換;f 和 h 的空間卷積的傅里葉變換,是它們的變換的乘積。
OpenCV 實(shí)現(xiàn)圖像傅里葉變換(cv.dft)
使用 OpenCV 中的 cv.dft() 函數(shù)也可以實(shí)現(xiàn)圖像的傅里葉變換,cv.idft() 函數(shù)實(shí)現(xiàn)圖像傅里葉逆變換。
函數(shù)說(shuō)明:
cv.dft(src[, dst[, flags[, nonzeroRows]]]) → dst cv.idft(src[, dst[, flags[, nonzeroRows]]]) → dst
參數(shù)說(shuō)明:
src:輸入圖像,單通道灰度圖像,使用 np.float32 格式
dst:輸出圖像,圖像大小與 src 相同,數(shù)據(jù)類(lèi)型由 flag 決定
flag:轉(zhuǎn)換標(biāo)識(shí)符
cv.DFT_INVERSE:用一維或二維逆變換取代默認(rèn)的正向變換
cv.DFT_SCALE:縮放比例標(biāo)識(shí),根據(jù)元素?cái)?shù)量求出縮放結(jié)果,常與DFT_INVERSE搭配使用
cv.DFT_ROWS: 對(duì)輸入矩陣的每行進(jìn)行正向或反向的傅里葉變換,常用于三維或高維變換等復(fù)雜操作
cv.DFT_COMPLEX_OUTPUT:對(duì)一維或二維實(shí)數(shù)數(shù)組進(jìn)行正向變換,默認(rèn)方法,結(jié)果是由 2個(gè)通道表示的復(fù)數(shù)陣列,第一通道是實(shí)數(shù)部分,第二通道是虛數(shù)部分
cv.DFT_REAL_OUTPUT:對(duì)一維或二維復(fù)數(shù)數(shù)組進(jìn)行逆變換,結(jié)果通常是一個(gè)尺寸相同的復(fù)數(shù)矩陣
注意事項(xiàng):
1.輸入圖像 src 是 np.float32 格式,如圖像使用 np.uint8 格式則必須先轉(zhuǎn)換 np.float32 格式。
2.默認(rèn)方法 cv.DFT_COMPLEX_OUTPUT 時(shí),輸入 src 是 np.float32 格式的單通道二維數(shù)組,輸出 dst 是 2個(gè)通道的二維數(shù)組,第一通道 dft[:,:,0] 是實(shí)數(shù)部分,第二通道 dft[:,:,1] 是虛數(shù)部分。
3.不能直接用于顯示圖像??梢允褂?cv.magnitude() 函數(shù)將傅里葉變換的結(jié)果轉(zhuǎn)換到灰度 [0,255]。
4.idft(src, dst, flags) 等價(jià)于 dft(src, dst, flags=DFT_INVERSE)。
5.OpenCV 實(shí)現(xiàn)傅里葉變換,計(jì)算速度比 Numpy 更快。
轉(zhuǎn)換標(biāo)識(shí)符為 cv.DFT_COMPLEX_OUTPUT 時(shí),cv.dft() 函數(shù)的輸出是 2個(gè)通道的二維數(shù)組,使用 cv.magnitude() 函數(shù)可以實(shí)現(xiàn)計(jì)算二維矢量的幅值 。
函數(shù)說(shuō)明:
cv.magnitude(x, y[, magnitude]) → dst
參數(shù)說(shuō)明:
x:一維或多維數(shù)組,也表示復(fù)數(shù)的實(shí)部,浮點(diǎn)型
y:一維或多維數(shù)組,也表示復(fù)數(shù)的虛部,浮點(diǎn)型,數(shù)組大小必須與 x 相同
dst:輸出數(shù)組,數(shù)組大小和數(shù)據(jù)類(lèi)型與 x 相同,運(yùn)算公式為:

傅里葉變換及相關(guān)操作的取值范圍可能不適于圖像顯示,需要進(jìn)行歸一化處理。 OpenCV 中的 cv.normalize() 函數(shù)可以實(shí)現(xiàn)圖像的歸一化。
函數(shù)說(shuō)明:
cv.normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) → dst
參數(shù)說(shuō)明:
src:輸入圖像
dst:輸出結(jié)果,與輸入圖像同尺寸同類(lèi)型
alpha:歸一化后的最小值,可選項(xiàng),默認(rèn)值為0
beta:歸一化后的最大值,可選項(xiàng),默認(rèn)值為1
norm_type:歸一化類(lèi)型
- NORM_INF:Linf 范數(shù)(絕對(duì)值的最大值)
- NORM_L1:L1 范數(shù)(絕對(duì)值的和)
- NORM_L2:L2 范數(shù)(歐幾里德距離),默認(rèn)類(lèi)型
- NORM_MINMAX:線性縮放,常用類(lèi)型
dtype:可選項(xiàng),默認(rèn)值 -1,表示輸出矩陣與輸入圖像類(lèi)型相同
mask:掩模遮罩,可選項(xiàng),默認(rèn)無(wú)遮罩
傅里葉變換在理論上需要O(MN)²次運(yùn)算,非常耗時(shí);快速傅里葉變換只需要O(MN㏒(MN)) 次運(yùn)算就可以完成。
OpenCV 中的傅里葉變換函數(shù) cv.dft() 對(duì)于行數(shù)和列數(shù)都可以分解為2^p*3^q*5^r的矩陣的計(jì)算性能最好。為了提高運(yùn)算性能,可以對(duì)原矩陣的右側(cè)和下方補(bǔ) 0,以滿足該分解條件。OpenCV 中的 cv.getOptimalDFTSize() 函數(shù)可以實(shí)現(xiàn)圖像的最優(yōu) DFT 尺寸擴(kuò)充,適用于 cv.dft() 和 np.fft.fft2()。
函數(shù)說(shuō)明:
cv.getOptimalDFTSize(versize) → retval
參數(shù)說(shuō)明:
versize:數(shù)組大小
retval:DFT 擴(kuò)充的最優(yōu)數(shù)組大小
示例代碼
# 8.11:OpenCV 實(shí)現(xiàn)二維圖像的離散傅里葉變換
imgGray = cv2.imread("../images/Fig0424a.tif", flags=0) # flags=0 讀取為灰度圖像
# cv2.dft 實(shí)現(xiàn)圖像的傅里葉變換
imgFloat32 = np.float32(imgGray) # 將圖像轉(zhuǎn)換成 float32
dft = cv2.dft(imgFloat32, flags=cv2.DFT_COMPLEX_OUTPUT) # 傅里葉變換
dftShift = np.fft.fftshift(dft) # 將低頻分量移動(dòng)到頻域圖像的中心
# 幅度譜
# ampSpe = np.sqrt(np.power(dft[:,:,0], 2) + np.power(dftShift[:,:,1], 2))
dftAmp = cv2.magnitude(dft[:,:,0], dft[:,:,1]) # 幅度譜,未中心化
dftShiftAmp = cv2.magnitude(dftShift[:,:,0], dftShift[:,:,1]) # 幅度譜,中心化
dftAmpLog = np.log(1 + dftShiftAmp) # 幅度譜對(duì)數(shù)變換,以便于顯示
# 相位譜
phase = np.arctan2(dftShift[:,:,1], dftShift[:,:,0]) # 計(jì)算相位角(弧度制)
dftPhi = phase / np.pi*180 # 將相位角轉(zhuǎn)換為 [-180, 180]
print("dftMag max={}, min={}".format(dftAmp.max(), dftAmp.min()))
print("dftPhi max={}, min={}".format(dftPhi.max(), dftPhi.min()))
print("dftAmpLog max={}, min={}".format(dftAmpLog.max(), dftAmpLog.min()))
# cv2.idft 實(shí)現(xiàn)圖像的逆傅里葉變換
invShift = np.fft.ifftshift(dftShift) # 將低頻逆轉(zhuǎn)換回圖像四角
imgIdft = cv2.idft(invShift) # 逆傅里葉變換
imgRebuild = cv2.magnitude(imgIdft[:,:,0], imgIdft[:,:,1]) # 重建圖像
plt.figure(figsize=(9, 6))
plt.subplot(231), plt.title("Original image"), plt.axis('off')
plt.imshow(imgGray, cmap='gray')
plt.subplot(232), plt.title("DFT Phase"), plt.axis('off')
plt.imshow(dftPhi, cmap='gray')
plt.subplot(233), plt.title("Rebuild image with IDFT"), plt.axis('off')
plt.imshow(imgRebuild, cmap='gray')
plt.subplot(234), plt.title("DFT amplitude spectrum"), plt.axis('off')
plt.imshow(dftAmp, cmap='gray')
plt.subplot(235), plt.title("DFT-shift amplitude"), plt.axis('off')
plt.imshow(dftShiftAmp, cmap='gray')
plt.subplot(236), plt.title("Log-trans of DFT amp"), plt.axis('off')
plt.imshow(dftAmpLog, cmap='gray')
plt.tight_layout()
plt.show()

到此這篇關(guān)于Python OpenCV實(shí)現(xiàn)圖像傅里葉變換的文章就介紹到這了,更多相關(guān)Python OpenCV傅里葉變換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
跟老齊學(xué)Python之編寫(xiě)類(lèi)之三子類(lèi)
本文已經(jīng)是編寫(xiě)類(lèi)系列的第三篇了,也是最后一篇,介紹下子類(lèi),也算是個(gè)小總結(jié)吧,有需要的朋友可以參考下2014-10-10
記錄一下scrapy中settings的一些配置小結(jié)
這篇文章主要介紹了記錄一下scrapy中settings的一些配置小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python內(nèi)置函數(shù)Type()函數(shù)一個(gè)有趣的用法
這篇文章主要介紹了Python內(nèi)置函數(shù)Type()函數(shù)一個(gè)有趣的用法,本文講解的是個(gè)人發(fā)現(xiàn)在的一個(gè)有趣的用法,注意這種寫(xiě)法會(huì)導(dǎo)致代碼很難讀,需要的朋友可以參考下2015-02-02
python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
在Apache服務(wù)器上同時(shí)運(yùn)行多個(gè)Django程序的方法
這篇文章主要介紹了在Apache服務(wù)器上同時(shí)運(yùn)行多個(gè)Django程序的方法,Django是Python各色高人氣web框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07
Python中的logging模塊實(shí)現(xiàn)日志打印
這篇文章主要介紹了Python中的logging模塊實(shí)現(xiàn)日志打印,其實(shí)不止print打印日志方便排查問(wèn)題,Python自帶的logging模塊,也可以很簡(jiǎn)單就能實(shí)現(xiàn)日志的配置和打印,下面來(lái)看看具體的實(shí)現(xiàn)過(guò)程吧,需要的朋友可以參考一下2022-03-03
Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署的方法
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比較常見(jiàn)的一種方式。這篇文章主要介紹了Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署,感興趣的小伙伴們可以參考一下2018-06-06
Python小程序編程實(shí)現(xiàn)一鍵自動(dòng)整理文件解壓文件
這篇文章主要為大家介紹了Python小程序編程實(shí)現(xiàn)一鍵自動(dòng)整理文件解壓文件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

