OpenCV圖像處理之傅里葉變換(1)
前言::
圖像處理在人工智慧領域是一個非常廣泛而且有前景的方向,在使用OpenCV的過程中,我們知道圖像的數字化是對它進行處理的一個很重要的部分,對於科學而言,更是靠著數據說話,在之前的文章中講過,用多維數組進行圖象數字化處理,這一次我們要講一個關於圖像信號轉換的一個偉大發明-傅里葉變換
在opencv中,對圖像乃至視頻的處理,或多或少會涉及傅里葉變換,這個變換的核心觀點就是所有的波形,都可以由一系列的簡單但是頻率不同的正弦曲線疊加得到,有一個經典的圖片可以很好的解釋這個內容
應知友建議:特地查了一下圖片來源 @Heinrich
(侵刪)
忽略其餘的數據,請看中間部分的曲線合成,傅里葉變換的根據亦是如此,將一個複雜的曲線通過抽離和變換,可以拿到自己想要的數據進行分析
對於傅里葉變換有一個基本的了解之後,我們直接涉及到的就是關於圖像的信號處理,話不讀說,通過一個例子,直接解讀代碼:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(123.png,0)f = np.fft.fft2(img)fshift = np.fft.fftshift(f)s1 = np.log(np.abs(fshift))# print(f)# fimg = np.log(np.abs(f))fimg = np.abs(s1)print(fimg)plt.imshow(fimg, gray)plt.show()
以上代碼,忽略掉注釋的代碼,在模塊numpy中fft2()就是傅里葉變換的簡單函數,首先我們以灰度模式讀入圖像,在imread()函數中參數中,0代表灰度模式,讀入以後用fft2函數,將讀入的數據進行傅里葉變換,根據以下規律:
傅里葉變換後的白色部分(即幅度較大的低頻部分),表示的是圖像中慢變化的特性,或者說是灰度變化緩慢的特性(低頻部分)。
傅里葉變換後的黑色部分(即幅度低的高頻部分),表示圖像中快變化的特性,或者說是灰度變化快的特性(高頻部分)。
傅里葉函數變換以後的圖像數據會變成複數形式如下圖:
這裡就必須提到大家可能沒有接觸過的一種三角函數表達方式:
一個三角函數的表示:
cos(x)+isin(x)?a+ib
是不是很熟悉,沒錯,就是複數形式表示那麼以上例子中:
fft2的複數結果保留了正弦波成分的所有信息,但頻譜圖只展現了頻率和振幅的分布。因此可以根據fft的結果還原原始圖像,但是我們做傅里葉變換的目的並不是為了觀察圖像的頻率分布(至少不是最終目的),更多情況下是為了對頻率進行過濾.
那麼我們得到的頻譜圖就是這樣的:
此圖像經過了中心化處理,即把低頻白色部分往中間移動,在上例子中使用的是fftshift()函數,為什麼這麼做,這裡不過贅述,之後會詳細讓大家理解,那麼得到頻譜圖,通過去中心化可以得到原來讀取之後的圖像,也就是用ifftshift()函數,結果如下:
這幾次的文章會慢慢深入的講解傅里葉變換的應用,歡迎關注
個人QQ:2533524298
參考資料:
Image Transforms - Fourier Transform
numpy.fft.fftshift - NumPy v1.14 Manual
Fourier Transformnumpy.fft.fftshift - NumPy v1.14 Manual
推薦閱讀:
※每天一練P9-Python和OpenCV做圖像處理(HoughLines)
※如何在unity里使用opencv?
※每天一練P2 Python和OpenCV做圖像處理(cvtColor)
※[171103] 基於縮略圖哈希值比較的圖像相似性檢索
※透視變換(進階)
TAG:圖像處理 | OpenCV | 傅里葉變換FourierTransform |