Python 计算机视觉(十三)—— 图像的傅里叶变换
參考的一些文章以及論文我都會給大家分享出來 —— 鏈接就貼在原文,論文我上傳到資源中去,大家可以免費下載學習,如果當天資源區找不到論文,那就等等,可能正在審核,審核完后就可以下載了。大家一起學習,一起進步!加油!!??
目錄
前言
(1)基本概念
(2)讀取圖像信息
1. 傅里葉變換
(1)基本概念
(2)numpy實現
(3)OpevCV實現?
2. 傅里葉逆變換
(1)基本概念
(2)代碼實現
結束語
前言
? ? ? ? 首先是本文總體代碼,改一下圖像的讀取路徑就可以運行了,但我還是建議大家先看后面的步驟一行行敲代碼,這樣效果更好:
""" Author:XiaoMa date:2021/11/7 """ import cv2 import matplotlib.pyplot as plt import numpy as np#讀取圖像信息 from numpy.fft import ifftshiftimg0 = 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) #轉化為灰度圖 h, w = img1.shape[:2] print(h, w) cv2.namedWindow("W0") cv2.imshow("W0", img2) cv2.waitKey(delay = 0) #將圖像轉化到頻域內并繪制頻譜圖 ##numpy實現 plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體 f = np.fft.fft2(img2) fshift = np.fft.fftshift(f) #將0頻率分量移動到圖像的中心 magnitude_spectrum0 = 20*np.log(np.abs(fshift)) #傅里葉逆變換 #Numpy實現 ifshift = np.fft.ifftshift(fshift) # 將復數轉為浮點數進行傅里葉頻譜圖顯示 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 = ['原始圖像', '經過移動后的頻譜圖', '逆變換得到的頻譜圖', '逆變換得到的原圖'] 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實現 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()(1)基本概念
? ? ? ? 一般我們觀察信號是直接在時域內(聲音信號)或者空間內(圖像)對其進行分析,這樣雖然符合常理,但信號中的一些有用的條件就不會被我們考慮進去,從而達不到分析的效果,所以我們要將信號轉化到其他的一些變換域中進行分析,對于信號轉化的重要性,可以參考我之前的文章:
數字信號處理 3.1 — 信號的變換域分析的重要性
(2)讀取圖像信息
本系列文章經典操作:
""" 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) #轉化為灰度圖 h, w = img1.shape[:2] print(h, w) cv2.namedWindow("W0") cv2.imshow("W0", img1) cv2.waitKey(delay = 0)得到圖像信息如下:
540 960?
1. 傅里葉變換
代碼參考:OpenCV官網
(1)基本概念
? ? ? ?當我們描述一段聲音時,我們不僅會說它的音量的大小如何,還有可能會說它的頻率是高的還是低的,那么我們該怎么理解頻率這個概念呢?以前學習三角函數時我們被告知每一個正弦信號有它的固定的頻率,就是它的周期的倒數。那么什么是頻域呢?我們也接觸過其他形狀的波形,比如方波、三角波等等,而這些不同形狀的波呢,就是用一個個頻率不相同的正弦波組成的,如果我們將那些不同頻率的正弦波按照它們的頻率大小排列起來,就得到了一個頻率軸(這是一維的),然后我們將各個頻率對應的幅度值給它們對應起來(就像xoy平面一樣)得到的二維的平面,就是頻域了。傅里葉變換就是將信號從時域轉化到頻域的一個工具。對于傅里葉變換中的的理解可以參考下面的圖片:
當然如果你想更加深入的了解傅里葉變換,你可以按照圖片上的水印去搜索,他那里講的非常清晰。?
(2)numpy實現
#將圖像轉化到頻域內并繪制頻譜圖 plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體 f = np.fft.fft2(img2) fshift = np.fft.fftshift(f) #將0頻率分量移動到中心 magnitude_spectrum = 20*np.log(np.abs(fshift)) plt.xticks([]) #除去刻度線 plt.yticks([]) plt.title("頻譜圖") plt.imshow(magnitude_spectrum, cmap = 'gray') plt.show()(3)OpevCV實現?
#OpenCV實現 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()??
2. 傅里葉逆變換
(1)基本概念
? ? ? ?前面提到,經過傅里葉變換圖像可以轉化到頻域內,那么經過傅里葉逆變換,圖像肯定能從頻域內轉化到時域中,所以傅里葉逆變換就是將信號從頻域轉化到時域的工具。
(2)代碼實現
此處的代碼接上面的使用 Numpy 進行傅里葉變換
#傅里葉逆變換 #Numpy實現 ifshift = np.fft.ifftshift(fshift) # 將復數轉為浮點數進行傅里葉頻譜圖顯示 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 = ['原始圖像', '經過移動后的頻譜圖', '逆變換得到的頻譜圖', '逆變換得到的原圖'] 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()?
結束語
? ? ? ? 圖像的傅里葉變換無非是就包括正變換、逆變換兩種情況,在本文中沒有介紹頻域內的高通和低通濾波,在后面會加以介紹,比起使用代碼實現傅里葉變換,了解它的本質是更加重要的,所以建議小伙伴們點進前面分享的那個鏈接進行學習,加油!
總結
以上是生活随笔為你收集整理的Python 计算机视觉(十三)—— 图像的傅里叶变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 计算机视觉(十二)—— O
- 下一篇: Python 计算机视觉(十四)—— O