您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何基于Python實(shí)現(xiàn)圖像的傅里葉變換,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
首先是本文總體代碼,改一下圖像的讀取路徑就可以運(yùn)行了,但我還是建議大家先看后面的步驟一行行敲代碼,這樣效果更好:
""" Author:XiaoMa date:2021/11/7 """ import cv2 import matplotlib.pyplot as plt import numpy as np #讀取圖像信息 from numpy.fft import ifftshift img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg") img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5) img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #轉(zhuǎn)化為灰度圖 h, w = img1.shape[:2] print(h, w) cv2.namedWindow("W0") cv2.imshow("W0", img2) cv2.waitKey(delay = 0) #將圖像轉(zhuǎn)化到頻域內(nèi)并繪制頻譜圖 ##numpy實(shí)現(xiàn) plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體 f = np.fft.fft2(img2) fshift = np.fft.fftshift(f) #將0頻率分量移動(dòng)到圖像的中心 magnitude_spectrum0 = 20*np.log(np.abs(fshift)) #傅里葉逆變換 #Numpy實(shí)現(xiàn) ifshift = np.fft.ifftshift(fshift) # 將復(fù)數(shù)轉(zhuǎn)為浮點(diǎn)數(shù)進(jìn)行傅里葉頻譜圖顯示 ifimg = np.log(np.abs(ifshift)) if_img = np.fft.ifft2(ifshift) origin_img = np.abs(if_img) imggroup = [img2, magnitude_spectrum0, ifimg, origin_img] titles0 = ['原始圖像', '經(jīng)過(guò)移動(dòng)后的頻譜圖', '逆變換得到的頻譜圖', '逆變換得到的原圖'] for i in range(4): plt.subplot(2, 2, i + 1) plt.xticks([]) #除去刻度線 plt.yticks([]) plt.title(titles0[i]) plt.imshow(imggroup[i], cmap = 'gray') plt.show() ##OpenCV實(shí)現(xiàn) dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) plt.subplot(121), plt.imshow(img2, cmap = 'gray') plt.title('原圖'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray') plt.title('頻譜圖'), plt.xticks([]), plt.yticks([]) plt.show()
一般我們觀察信號(hào)是直接在時(shí)域內(nèi)(聲音信號(hào))或者空間內(nèi)(圖像)對(duì)其進(jìn)行分析,這樣雖然符合常理,但信號(hào)中的一些有用的條件就不會(huì)被我們考慮進(jìn)去,從而達(dá)不到分析的效果,所以我們要將信號(hào)轉(zhuǎn)化到其他的一些變換域中進(jìn)行分析。
本系列文章經(jīng)典操作:
""" Author:XiaoMa date:2021/11/7 """ import cv2 import matplotlib.pyplot as plt import numpy as np #讀取圖像信息 img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg") img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5) img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #轉(zhuǎn)化為灰度圖 h, w = img1.shape[:2] print(h, w) cv2.namedWindow("W0") cv2.imshow("W0", img1) cv2.waitKey(delay = 0)
得到圖像信息如下:
540 960
代碼參考:OpenCV官網(wǎng)
當(dāng)我們描述一段聲音時(shí),我們不僅會(huì)說(shuō)它的音量的大小如何,還有可能會(huì)說(shuō)它的頻率是高的還是低的,那么我們?cè)撛趺蠢斫忸l率這個(gè)概念呢?以前學(xué)習(xí)三角函數(shù)時(shí)我們被告知每一個(gè)正弦信號(hào)有它的固定的頻率,就是它的周期的倒數(shù)。那么什么是頻域呢?我們也接觸過(guò)其他形狀的波形,比如方波、三角波等等,而這些不同形狀的波呢,就是用一個(gè)個(gè)頻率不相同的正弦波組成的,如果我們將那些不同頻率的正弦波按照它們的頻率大小排列起來(lái),就得到了一個(gè)頻率軸(這是一維的),然后我們將各個(gè)頻率對(duì)應(yīng)的幅度值給它們對(duì)應(yīng)起來(lái)(就像xoy平面一樣)得到的二維的平面,就是頻域了。傅里葉變換就是將信號(hào)從時(shí)域轉(zhuǎn)化到頻域的一個(gè)工具。對(duì)于傅里葉變換中的的理解可以參考下面的圖片:
當(dāng)然如果你想更加深入的了解傅里葉變換,你可以按照?qǐng)D片上的水印去搜索,他那里講的非常清晰。
#將圖像轉(zhuǎn)化到頻域內(nèi)并繪制頻譜圖 plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體 f = np.fft.fft2(img2) fshift = np.fft.fftshift(f) #將0頻率分量移動(dòng)到中心 magnitude_spectrum = 20*np.log(np.abs(fshift)) plt.xticks([]) #除去刻度線 plt.yticks([]) plt.title("頻譜圖") plt.imshow(magnitude_spectrum, cmap = 'gray') plt.show()
#OpenCV實(shí)現(xiàn) dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) plt.subplot(121), plt.imshow(img2, cmap = 'gray') plt.title('原圖'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray') plt.title('頻譜圖'), plt.xticks([]), plt.yticks([]) plt.show()
前面提到,經(jīng)過(guò)傅里葉變換圖像可以轉(zhuǎn)化到頻域內(nèi),那么經(jīng)過(guò)傅里葉逆變換,圖像肯定能從頻域內(nèi)轉(zhuǎn)化到時(shí)域中,所以傅里葉逆變換就是將信號(hào)從頻域轉(zhuǎn)化到時(shí)域的工具。
此處的代碼接上面的使用 Numpy 進(jìn)行傅里葉變換
#傅里葉逆變換 #Numpy實(shí)現(xiàn) ifshift = np.fft.ifftshift(fshift) # 將復(fù)數(shù)轉(zhuǎn)為浮點(diǎn)數(shù)進(jìn)行傅里葉頻譜圖顯示 ifimg = np.log(np.abs(ifshift)) if_img = np.fft.ifft2(ifshift) origin_img = np.abs(if_img) imggroup = [img2, magnitude_spectrum0, ifimg, origin_img] titles0 = ['原始圖像', '經(jīng)過(guò)移動(dòng)后的頻譜圖', '逆變換得到的頻譜圖', '逆變換得到的原圖'] for i in range(4): plt.subplot(2, 2, i + 1) plt.xticks([]) #除去刻度線 plt.yticks([]) plt.title(titles0[i]) plt.imshow(imggroup[i], cmap = 'gray') plt.show()
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何基于Python實(shí)現(xiàn)圖像的傅里葉變換”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。