天天看點

r語言把兩個折線圖圖像放到一個圖裡_OpenCV計算機視覺學習(10)——圖像變換(傅裡葉變換,高通濾波,低通濾波)...

Fly-AI競賽服務平台

在開始學習之前推薦大家可以多在

FlyAI競賽服務平台

多參加訓練和競賽,以此來提升自己的能力。FlyAI是為AI開發者提供資料競賽并支援GPU離線訓練的一站式服務平台。每周免費提供項目開源算法樣例,支援算法能力變現以及快速的疊代算法模型。

如果需要處理的原圖及代碼,請移步小編的GitHub位址

  傳送門:請點選我

如果點選有誤: https:// github.com/LeBron-Jian/ ComputerVisionPractice

  在數字圖像進行中,有兩個經典的變換被廣泛應用——傅裡葉變換和霍夫變化。其中,傅裡葉變換主要是将時間域上的信号轉變為頻率域上的信号,用來進行圖像降噪,圖像增強等處理,這一篇主要學習傅裡葉變換,後面在學習霍夫變換。

  下面學習一下傅裡葉變換。有人說傅裡葉分析不僅僅是一個數學工具,更是一種可以徹底颠覆一個人以前世界觀的思維模式(出處(強烈建議看這篇文章):https://zhuanlan.zhihu.com/p/19763358)

傅裡葉變換的作用

  對于數字圖像這種離散的信号,頻率大小表示信号變換的劇烈程度或者說信号變化的快慢。頻率越大,變換越劇烈,頻率越小,信号越平緩,對應到的圖像中,高頻信号往往是圖像中的邊緣信号和噪聲信号,而低頻信号包含圖像變化頻繁的圖像輪廓及背景燈信号。

  需要說明的是:傅裡葉變換得到的頻譜圖上的點與原圖像上的點之間不存在一一對應的關系。

  • 高頻:變換劇烈的灰階分量,例如邊界
  • 低頻:變換緩慢的灰階分量,例如一片大海
濾波器:
  • 低通濾波器:隻保留低頻,會使得圖像模糊
  • 高頻濾波器:隻保留高頻,會使得圖像細節增強

  不懂的話,可以看之前文章中粘貼的一幅圖,這裡再粘貼一下:

具體模糊和濾波的關系如下圖(https://www.zhihu.com/question/54918332/answer/142137732):

1,頻域及其頻域資料的應用

什麼是頻域

  從我們出世,我們看到的世界都是以時間貫穿,股票的走勢,人的身高,汽車的軌迹都會随着時間發生變換。這種以時間作為參照來觀察動态世界的方法我們稱其為時域分析。而我們也想當然的認為,世間萬物都在随着時間不停的改變,并且永遠不會停止下來。但是我們可以用另一種方法觀察世界的話,你可以發現世界是永恒不變的,而這個靜止的世界就叫做頻域。

  正式定義:頻域是描述信号在頻率方面特性時用到的一種坐标系。在電子學,控制系統工程和統計學中,頻域圖顯示了一個在頻率範圍内每個給定頻帶内的信号量。

  下面舉個例子:

  我們普通人對音樂的了解是什麼呢?可能如下圖:

  上圖是我們對音樂最普遍的了解,一個随着時間變化的震動。但是我相信對于樂手來說,音樂更直覺的了解是這樣的:

  下面我們将兩個圖簡化,借用百度百科的正弦函數在時域和頻域的表現如下:

  總結來說,在時域我們觀察到鋼琴的琴弦一會上一會下的擺動,如同上圖上一樣的走勢,而在頻域,就隻是永恒的,如上圖下一樣。而貫穿時域與頻域的方法之一,就是傅裡葉分析。傅裡葉分析可分為傅裡葉級數(Fourier Serie)和傅裡葉變換(Fourier Transformation)。

頻域資料的應用

圖像去噪

  我們可以根據需要獲得在頻域對圖像進行處理,比如在需要除去圖像中的噪聲時,我們可以設計一個低通濾波器,去掉圖像中的高頻噪聲,但是往往也會抑制圖像的邊緣資訊,這就是造成圖像模糊的原因。以均值濾波為例,用均值模闆與圖像做卷積,大家都知道,在空間域做卷積,相當于在頻域做乘積,而均值模闆在頻域是沒有高頻信号的,隻有一個常量的分量,是以均值模闆是對圖像局部做低通濾波。除此之外,常見的高斯濾波也是一種低通濾波器,因為高斯函數經過傅裡葉變換後,在頻域的分布依然服從高斯分布,如下圖所示,是以它對高頻資訊有很好的濾除效果。

圖像增強及銳化

  圖像增強需要增強圖像的細節,而圖像的細節往往就是圖像中高頻的部分,是以增強圖像中的高頻資訊能夠達到圖像增強的目的。

  同樣的圖像銳化的目的是使模糊的圖像變得更加清晰,其主要方式是增強圖像的邊緣部分,其實就是增強圖像中灰階變化劇烈的部分,是以通過增強圖像中的高頻資訊能夠增強圖像邊緣,進而達到圖像銳化的目的。從這裡可以看出,可以通過提取圖像中的高頻信号來得到圖像的邊緣和紋理資訊。

2,傅裡葉變換原理

舉例分析傅裡葉變換

  傅裡葉變換(Fourier Transform,簡稱FT)常用于數字信号處理,它的目的是将時間域上的信号轉變為頻率域上的信号。随着域的不同,對同一個事物的了解角度也随之改變,是以在時域某些不好處理的地方,在頻域就可以較為簡單的處理。同時,可以從頻域裡發現一些原先不易察覺的特征。傅裡葉定理指出“任何連續周期信号都可以表示成(或者無限逼近)一系列正弦信号的疊加”。

  下面引用“Python + OpenCV圖像處理課程”(位址在文末給出)中的一個案例,他将某飲料的制作過程的時域角度轉換為頻域角度。

  繪制對應的時間圖和頻率圖如下所示:

  傅裡葉公式如下,其中 w 表示頻率,t 表示時間,為複變函數。它将時間域的函數表示為頻率域的函數 f(t) 的積分。

  傅裡葉變換認為一個周期函數(信号)包含多個頻率分量,任意函數(信号) f(t) 可通過多個周期函數(或基函數)相加合成。從實體角度了解,傅裡葉變換是以一組特殊的函數(三角函數)為正交基,對原函數進行線性變換,實體意義便是原函數在各組基函數的投影。如下圖所示,它是由三條正弦曲線組成:

  傅裡葉變換可以應用于圖像進行中,經過對圖像進行變換得到其頻譜圖。從頻譜圖裡頻率高低來表征圖像中灰階變化劇烈程度。圖像中的邊緣信号和噪聲信号往往是高頻信号,而圖像變換頻繁的圖像輪廓及背景等信号往往是低頻信号。這時可以有針對性的對圖像進行相關操作,例如圖像除噪,圖像增強和銳化等。

  二維圖像的傅裡葉變換可以用以下數學公式表示,其中 f 是空間域(Spatial Domain)的值, F 是頻域(Frequency Domain)值

二維傅裡葉變換的定義

  上面其實已經引出了二維傅裡葉變換,這裡詳細學習一下。

  首先我們看一下連續型二維傅裡葉變換:

  連續型二維傅裡葉變換的逆變換:

  下面看一下離散型二維傅裡葉變換(當我們定義圖像尺寸為M*N,則函數的離散傅裡葉變換由以下等式給出):

  離散傅裡葉逆變換由下式給出:

  令R和I分别表示F的實部和虛部,則傅裡葉頻譜,相位角,功率譜(幅度)定義如下:

用 FFT 計算二維離散傅裡葉變換

  二維離散傅裡葉變換的定義為:

  二維離散傅裡葉變換可通過兩次一維離散傅裡葉變換來實作:

  (1)做一維N點DFT(對每個 m 做一次,共 M 次)

  (2)作M點的DFT(對每個k做一次,共N次)

  這兩次離散傅裡葉變換都可以用快速算法求得,若M和N都是2的幂,則可以使用基二FFT算法,所需要乘法次數為:

  而直接計算二維離散傅裡葉變換所需要的乘法次數為(M+N)MN,當M和N比較大用FFT運算,可節約很多運算量。

圖像傅裡葉變換的實體意義

  圖像的頻率是表征圖像中灰階變換劇烈程度的名額,是灰階在平面空間上的梯度。如:大面積的沙漠在圖像中是一片灰階變化緩慢的區域,對應的頻率值很低;而對于地表屬性變換劇烈的邊緣區域在圖像中是一片灰階變化劇烈的區域,對應的頻率值較高。傅裡葉變換在實際中有明顯的實體意義,設f 是一個能量有限的模拟信号,則其傅裡葉變換就表示 f 的頻譜。從純粹的數學意義上看,傅裡葉變換是将一個函數轉換為一系列周期函數來處理的。從實體效果來看,傅裡葉變換是将圖像從空間域轉換到頻率域,其逆變換是将圖像從頻率域轉換到空間域。換句話說,傅裡葉變換的實體意義是将圖像的灰階分布函數變換為圖像的頻率分布函數。

  傅裡葉逆變換是将圖像的頻率分布函數變換為灰階分布函數傅裡葉變換以前,圖像(未壓縮的位圖)是由對在連續空間(現實空間)上的采樣得到一系列的集合,通常用一個二維矩陣表示空間上各點,記為 z=f(x, y)。又因為空間是三維的,圖像是二維的,是以空間中物體在另一個次元上的關系就必須由梯度來表示,這樣我們才能通過觀察圖像得知物體在三維空間中的對應關系。

  傅裡葉頻譜圖上我們看到的明暗不一的亮點,其意義是指圖像上某一點與領域點差異的強弱,即梯度的大小。也即該點的頻率的大小(可以這麼了解,圖像中低頻部分指低梯度的點,高頻部分相反)。一般來說,梯度大則該點的亮度強,否則該點的亮度弱。這樣通過觀察傅裡葉變換後的頻譜圖,也叫功率圖,我們就可以直覺的看出圖像的能量分布:如果頻譜圖中暗的點數更多,那麼實際圖像是比較柔和的(因為各點與領域差異都不大,梯度相對較小);反之,如果頻譜圖中亮的點數多,那麼實際圖像一定是尖銳的,邊界分明且邊界兩邊像素差異較大的。

  對頻譜移頻到原點以後,可以看出圖像的頻率分布是以原點為圓心,對稱分布的。将頻譜移頻到圓心除了可以清晰的看出圖像頻率分布以外,還有一個好處,它可以分離出周期性規律的幹擾信号,比如正弦幹擾。一幅頻譜圖如果帶有正弦幹擾,移頻到原點上就可以看出,除了中心以外還存在以另一點為中心,對稱分布的亮點集合,這個集合就是幹擾噪音産生的。這時可以很直覺的通過在該位置放置帶阻濾波器消除幹擾。

  對上面的傅裡葉變換有了大緻的了解之後,下面通過Numpy和OpenCV分别學習圖像傅裡葉變換的算法及操作代碼。

二維傅裡葉變換的性質

分離性

  二維離散傅裡葉變換具有分離性

  分離性質的主要優點是可借助一系列一維傅裡葉變換分兩步求得。第一步,沿着的每一行取變換,将其結果乘以 1/N,取得二維函數;第二步,沿着的每一列取變換,再将結果乘以 1/N就得到了。這種方法是先行後列。如果采用先列後行的順序,其結果相同。

  如圖:

  對逆變換 f(x, y) 也可以類似的分兩步進行:

平移性

  傅裡葉變換和逆變換對的位移性質是指:

  由乘以指數項并取其乘積的傅裡葉變換,使頻率平面的原點位移至。同樣的,以指數項乘以并取其反變換,将空間域平面的原點位移至當 N/2時,指數項為:

  即為:

  這樣,用(x+y)乘以就可以将的傅裡葉變換原點移動到 N*N 頻率方陣的中心,這樣才能看到整個譜圖。另外,對的平移不影響其傅裡葉變換的幅值。

  此外,與連續二維傅裡葉變換一樣,二維離散傅裡葉變換也具有周期性,共轭對稱性,線性,旋轉性,相關定理,卷積定理,比例性等性質。這些性質在分析以及處理圖像時有重要意義。

二維離散傅裡葉變換的圖像性質

  1,圖像經過二維傅裡葉的變換後,其變換稀疏矩陣具有如下性質:若交換矩陣原點設在中心,其頻譜能量集中分布在變換稀疏矩陣的中心附近。若所用的二維傅裡葉變換矩陣的雲巅設在左上角,那麼圖像信号能量将集中在系數矩陣的四個角上。這是由二維傅裡葉變換本身性質決定的。同時也表明一股圖像能量集中低頻區域。

  2,圖像灰階變化緩慢的區域,對應它變換後的低頻分量部分;圖像灰階呈階躍變化的區域,對應變換後的高頻分量部分。除顆粒噪音外,圖像細節的邊緣,輪廓處都是灰階變換突變區域,他們都具有變換後的高頻分量特征。

3,傅裡葉變換的實作

  注意:無論是numpy實作,還是OpenCV實作,得到的結果中頻率為0的部分都會在左上角,通常要轉換到中心位置,可以通過shift變換來實作。

3.1 Numpy實作傅裡葉變換

  Numpy的 FFT 包提供了函數 () 可以對信号進行快速傅裡葉變換,其函數原型如下所示(該函數的輸出結果是一個複數數組complex ndarray)

fft2(a, s=None, axes=(-2, -1), norm=None)           

參數意義:

  • a表示輸入圖像,陣列狀的複雜數組
  • s表示整數序列,可以決定輸出數組的大小。輸出可選形狀(每個轉換軸的長度),其中s[0]表示軸0,s[1]表示軸1。對應fit(x,n)函數中的n,沿着每個軸,如果給定的形狀小于輸入形狀,則将剪切輸入。如果大于則輸入将用零填充。如果未給定’s’,則使用沿’axles’指定的軸的輸入形狀
  • axes表示整數序列,用于計算FFT的可選軸。如果未給出,則使用最後兩個軸。“axes”中的重複索引表示對該軸執行多次轉換,一個元素序列意味着執行一維FFT
  • norm包括None和ortho兩個選項,規範化模式(請參見)。預設值為無

  Numpy中fft子產品有很多函數,相關函數如下:

#計算一維傅裡葉變換
.fft(a, n=None, axis=-1, norm=None)
 
#計算二維的傅裡葉變換
.fft2(a, n=None, axis=-1, norm=None)
 
#計算n維的傅裡葉變換
.fftn()
 
#計算n維實數的傅裡葉變換
.rfftn()
 
#傳回傅裡葉變換的采樣頻率
.fftfreq()
 
#将FFT輸出中的直流分量移動到頻譜中央
.shift()           

下面的代碼是通過Numpy實作傅裡葉變換,調用 () 快速傅裡葉變換得到頻率分布,接着調用 () 函數将中心位置轉移至中間,最終通過 Matplotlib顯示效果圖。

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 讀取圖像
img = ('', )
# 圖像進行灰階化處理
img = (img, )
 
# 快速傅裡葉變換算法得到頻率分布
f = (img)
 
# 預設結果中心點位置是在左上角
# 調用fftshift()函數轉移到中間位置
fshift = (f)
 
# fft 結果是複數,其絕對值結果是振幅
fimg = ((fshift))
 
# 展示結果
(121), (img, 'gray'), ('original Fourier')
('off')
(122), (fimg, 'gray'), ('fourier Fourier')
('off')
()           

結果如下:

  我們從上面結果看到,左邊為原始圖像,右邊為頻率分布圖譜,其中越靠近中心位置頻率越低,越亮(灰階值越高)的位置代表該頻率的資訊振幅越大。

3.2 OpenCV實作傅裡葉變換

  OpenCV中實作傅裡葉變換的函數是 (),他和Numpy輸出的結果是一樣的,但是是雙通道的。第一個通道是結果的實數部分,第二個通道是結果的虛數部分,并且輸入圖像要首先轉換成 格式。其函數原型如下:

dst = (src, dst=None, flags=None, nonzeroRows=None)           

參數含義:

  • src表示輸入圖像,需要通過轉換格式
  • dst表示輸出圖像,包括輸出大小和尺寸flags表示轉換标記,其中:

    DFT _INVERSE執行反向一維或二維轉換,而不是預設的正向轉換;

    DFT _SCALE表示縮放結果,由陣列元素的數量除以它;

    DFT _ROWS執行正向或反向變換輸入矩陣的每個單獨的行,該标志可以同時轉換多個矢量,并可用于減少開銷以執行3D和更高次元的轉換等;

    DFT _COMPLEX_OUTPUT執行1D或2D實數組的正向轉換,這是最快的選擇,預設功能;

    DFT _REAL_OUTPUT執行一維或二維複數陣列的逆變換,結果通常是相同大小的複數數組,但如果輸入數組具有共轭複數對稱性,則輸出為真實數組

  • nonzeroRows表示當參數不為零時,函數假定隻有nonzeroRows輸入數組的第一行(未設定)或者隻有輸出數組的第一個(設定)包含非零,是以函數可以處理其餘的行更有效率,并節省一些時間;這種技術對計算陣列互相關或使用DFT卷積非常有用

  注意:

由于輸出的頻譜結果是一個複數,需要調用 () 函數将傅裡葉變換的雙通達結果轉換為0到255的範圍

。其函數原型如下:

(x, y, magnitude=None)           

參數意義:

    • x表示浮點型X坐标值,即實部
    • y表示浮點型Y坐标值,即虛部

      最終輸出結果為幅值,即:

  完整代碼如下:

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 讀取圖像
img = ('', )
# 圖像進行灰階化處理
img = (img, )
 
# 傅裡葉變換
#  執行一維或二維複數陣列的逆變換,結果通常是相同大小的複數數組
dft = ((img), flags=)
 
# 将頻譜低頻從左上角移動到中心位置
dft_shift = (dft)
 
# 頻譜圖像雙通道複數轉換為0~255區間
result = 10 * ((dft_shift[:, :, 0], dft_shift[:, :, 1]))
 
# 顯示圖像
(121), (img, cmap='gray')
('Input image')
([]), ([])
(122), (result, cmap='gray')
('Magnitude Spectrum')
([]), ([])
()           

結果如下:

  上圖左邊為原始圖,右邊為轉換後的頻譜圖像,并且保證低頻位于中心位置。

4,傅裡葉逆變換的實作

  注意:無論是numpy實作,還是OpenCV實作,得到的結果中頻率為0的部分都會在左上角,通常要轉換到中心位置,可以通過shift變換來實作。

4.1 Numpy實作傅裡葉逆變換

  下面介紹 Numpy實作傅裡葉逆變換,它是傅裡葉變換的逆操作,将頻譜圖像轉換為原始圖像的過程。通過傅裡葉變換将轉換為頻譜圖,并對高頻(邊界)和低頻(細節)部分進行處理,接着需要通過傅裡葉逆變換恢複為原始效果圖。頻域上對圖像的處理會反映在逆變換圖像上,進而更好地進行圖像處理。

  圖像傅裡葉變換主要使用的函數如下所示:

#實作圖像逆傅裡葉變換,傳回一個複數數組
.ifft2(a, n=None, axis=-1, norm=None)
 
#fftshit()函數的逆函數,它将頻譜圖像的中心低頻部分移動至左上角
.fftshift()
 
#将複數轉換為0至255範圍
iimg = (逆傅裡葉變換結果)           

下面代碼實作了傅裡葉變換和傅裡葉逆變換

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 讀取圖像
img = ('', )
# 圖像進行灰階化處理
img = (img, )
 
# 傅裡葉變換
# 快速傅裡葉變換算法得到頻率分布
f = (img)
# 預設結果中心點位置是在左上角 調用fftshift()函數轉移到中間位置
fshift = (f)
# fft 結果是複數,其絕對值結果是振幅
rimg = ((fshift))
 
# 傅裡葉逆變換
ishift = (fshift)
iimg = (ishift)
iimg = (iimg)
 
 
# 展示結果
(131), (img, 'gray'), ('original Fourier')
('off')
(132), (rimg, 'gray'), ('fourier Fourier')
('off')
(133), (iimg, 'gray'), ('inverse fourier Fourier')
('off')
()           

結果如下:

4.2 OpenCV實作傅裡葉逆變換

  在OpenCV中,通過函數 ()函數實作傅裡葉逆變換,其傳回結果取決于原始圖像的類型和大小,原始圖像可以為複數或實數,同時也要注意

輸入圖像需要先轉換成 格式

,其函數原型如下:

dst = (src[, dst[, flags[, nonzeroRows]]])           

參數意義:

  • src表示輸入圖像,包括實數或複數
  • dst表示輸出圖像
  • flags表示轉換标記
  • nonzeroRows表示要處理的dst行數,其餘行的内容未定義(請參閱dft描述中的卷積示例)

  完整代碼如下:

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 讀取圖像
img = ('', )
# 圖像進行灰階化處理
img = (img, )
 
# 傅裡葉變換
#  執行一維或二維複數陣列的逆變換,結果通常是相同大小的複數數組
dft = ((img), flags=)
# 将頻譜低頻從左上角移動到中心位置
dft_shift = (dft)
# 頻譜圖像雙通道複數轉換為0~255區間
result = 10 * ((dft_shift[:, :, 0], dft_shift[:, :, 1]))
 
# 傅裡葉逆變換
ishift = (dft_shift)
iimg = (ishift)
iresult = (iimg[:, :, 0], iimg[:, :, 1])
 
 
# 顯示圖像
(131), (img, cmap='gray')
('Input image')
([]), ([])
(132), (result, cmap='gray')
('Magnitude Spectrum')
([]), ([])
(133), (iresult, cmap='gray')
('inverse Magnitude Spectrum')
([]), ([])
()           

結果如圖所示:

  傅裡葉變換的目的并不是為了觀察圖像的頻率分布(至少不是最終目的),更多情況下是為了對頻率進行過濾,通過修改頻率以達到圖像增強,圖像去噪,邊緣檢測,特征提取,壓縮加密等目的。

  過濾的方法一般有三種:低通(low-pass),高通(high-pass),帶通(band-pass),下面一一學習。

5,高通濾波

  高通濾波器是指通過高頻的濾波器,衰減低頻而通過高頻,常用于增強尖銳的細節,但會導緻圖像的對比度會降低。該濾波器将檢測圖像的某個區域,根據像素與周圍像素的內插補點來提升像素的亮度。下圖展示了“Lena”圖對應的頻譜圖像,其中心區域為低頻部分。

  接着通過高通濾波器覆寫掉中心低頻部分,将255的點變換為0,同時保留高頻部分,其處理過程如下圖所示:

  高通濾波器主要通過矩陣設定構造,其核心代碼如下:

rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0           

下面自己百度找一張lena圖,做一下,代碼如下:

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 讀取圖像
img = ('', 0)
 
# 傅裡葉變換
fimg = (img)
fshift = (fimg)
 
# 設定高通濾波器
rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
 
# 傅裡葉逆變換
ishift = (fshift)
iimg = (ishift)
iimg = (iimg)
 
# 顯示原始圖像和高通濾波處理圖像
(121), (img, 'gray'), ('gray Image')
('off')
(122), (iimg, 'gray'), ('Result Image')
('off')
()           

結果如下:

  左邊圖為lena的灰階圖,右邊圖為高通濾波器提取的邊緣輪廓圖像,它通過傅裡葉變換轉換為頻譜圖像,再将中心的低頻部分設定為0,再通過傅裡葉逆變換轉換為最終輸出圖像。

6,低通濾波

  所謂低通就是保留圖像中的低頻成分,過濾高頻成分,可以把過濾器想象成一張漁網,想要低通過濾器,就是要将高頻區域的信号全部拉黑,而低頻區域全部保留。例如,在一幅大草原的圖像中,低頻對應着廣袤且顔色趨于一緻的草原,表示圖像變換緩慢的灰階分量;高頻對應着草原圖像中的老虎等邊緣資訊,表示圖像變換較快的灰階分量,由于灰階尖銳過度造成。

  低通濾波器是指通過低頻的濾波器,衰減高頻而通過低頻,常用于模糊圖像。低頻濾波器與高通濾波器相反,當一個像素與周圍像素的插值小于一個特定值時,平滑該像素的亮度,常用于去噪和模糊化處理。如PS軟體中的高斯模糊,就是常見的模糊濾波器之一,屬于削弱高頻信号的低通濾波器。

  下圖展示了lena圖對應的頻譜圖像,其中心區域為低頻部分。如果構造低通濾波器,則将頻譜圖像中心低頻部分保留,其他部分替換為黑色0,其處理過程如圖所示,最終得到的效果圖為模糊圖像。

  那麼,如何構造該濾波圖像呢?如下圖所示,濾波圖像是通過低通濾波器和頻譜圖像形成。其中低通濾波器中心區域為白色255,其他區域為黑色0。

  低通濾波器主要通過矩陣設定構造,其核心代碼如下:

rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
mask = ((rows, cols, 2), )
mask[crow-30:crow+30, ccol-30:ccol+30] = 1           

通過低通濾波器将模糊圖像的完整代碼如下:

# _*_ coding:utf-8 _*_
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 讀取圖像
img = ('', 0)
 
# 傅裡葉變換
# fimg = (img)
fimg = ((img), flags=)
fshift = (fimg)
 
# 設定低通濾波器
rows, cols = img.shape
# 中心位置
crow, ccol = int(rows / 2), int(cols / 2)
mask = ((rows, cols, 2), )
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1
 
# 掩膜圖像和頻譜圖像乘積
f = fshift * mask
print(f.shape, fshift.shape, mask.shape)
# (199, 198, 2) (199, 198, 2) (199, 198, 2)
 
 
# 傅裡葉逆變換
ishift = (f)
iimg = (ishift)
iimg = (iimg[:, :, 0], iimg[:, :, 1])
 
# 顯示原始圖像和高通濾波處理圖像
(121), (img, 'gray'), ('gray Image')
('off')
(122), (iimg, 'gray'), ('Result Image')
('off')
()           

結果如下:

參考文獻: https:// /Eastmount /article/details/89474405 https:// /Eastmount /article/details/89645301

Python + OpenCV圖像處理課程( https:// study.163.com/course/co urseLearn.htm?courseId=1005317018#/learn/text?lessonId=1052508042&courseId=1005317018 ) https://www. cnblogs.com/tenderwx/p/ 5245859.html

【圖像處理】數字圖像傅裡葉變換的實體意義及簡單應用_不用先生的部落格-CSDN部落格​

r語言把兩個折線圖圖像放到一個圖裡_OpenCV計算機視覺學習(10)——圖像變換(傅裡葉變換,高通濾波,低通濾波)...
更多精彩内容請通路FlyAI-AI競賽服務平台;為AI開發者提供資料競賽并支援GPU離線訓練的一站式服務平台;每周免費提供項目開源算法樣例,支援算法能力變現以及快速的疊代算法模型。 挑戰者,都在FlyAI!!!

繼續閱讀