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函數,將讀入的數據進行傅里葉變換,根據以下規律:

傅里葉變換後的白色部分(即幅度較大的低頻部分),表示的是圖像中慢變化的特性,或者說是灰度變化緩慢的特性(低頻部分)。

傅里葉變換後的黑色部分(即幅度低的高頻部分),表示圖像中快變化的特性,或者說是灰度變化快的特性(高頻部分)。

傅里葉函數變換以後的圖像數據會變成複數形式如下圖:

輸出部分就是fft2()函數的返回值

這裡就必須提到大家可能沒有接觸過的一種三角函數表達方式:

cos(x)+isin(x)?a+ib

一個三角函數的表示:

cos(x)+isin(x)?a+ib

是不是很熟悉,沒錯,就是複數形式表示那麼以上例子中:

fft2的複數結果保留了正弦波成分的所有信息,但頻譜圖只展現了頻率和振幅的分布。因此可以根據fft的結果還原原始圖像,但是我們做傅里葉變換的目的並不是為了觀察圖像的頻率分布(至少不是最終目的),更多情況下是為了對頻率進行過濾.

那麼我們得到的頻譜圖就是這樣的:

此圖像經過了中心化處理,即把低頻白色部分往中間移動,在上例子中使用的是fftshift()函數,為什麼這麼做,這裡不過贅述,之後會詳細讓大家理解,那麼得到頻譜圖,通過去中心化可以得到原來讀取之後的圖像,也就是用ifftshift()函數,結果如下:


這幾次的文章會慢慢深入的講解傅里葉變換的應用,歡迎關注

個人QQ:2533524298


參考資料:

Image Transforms - Fourier Transform

numpy.fft.fftshift - NumPy v1.14 Manual

Fourier Transform?

homepages.inf.ed.ac.uk圖標

numpy.fft.fftshift - NumPy v1.14 Manual


推薦閱讀:

每天一練P9-Python和OpenCV做圖像處理(HoughLines)
如何在unity里使用opencv?
每天一練P2 Python和OpenCV做圖像處理(cvtColor)
[171103] 基於縮略圖哈希值比較的圖像相似性檢索
透視變換(進階)

TAG:圖像處理 | OpenCV | 傅里葉變換FourierTransform |