生活随笔
收集整理的這篇文章主要介紹了
数字图像处理与Python实现笔记之频域滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數字圖像處理與Python實現筆記 摘要 緒論 1 數字圖像處理基礎知識 2 彩色圖像處理初步 3 空間濾波 4 頻域濾波 4.1 傅里葉變換 4.1.1 一維傅里葉變換 4.1.2 二維傅里葉變換 4.2 傅里葉變換的性質 4.2.1 傅里葉變換的基本性質 4.2.2 二維傅里葉變換的性質 4.3 快速傅里葉變換 4.3.1 快速傅里葉變換的原理 4.3.2 快速傅里葉變換的實現 4.4 圖像的頻域濾波 4.4.1 低通濾波 第一種 理想低通濾波器 第二種 Butterworth低通濾波器 4.4.2 高通濾波 第一種 理想高通濾波 第二種 Butterworth高通濾波 第三種 高頻增強濾波器 4.5 小結 參考資料
摘要
簡要介紹數字圖像處理涉及的一些基本概念、基本運算、基本類型,以及如何通過Python對數字圖像進行讀取和簡單操作。 以彩色圖像為例對數字圖像處理的基本操作進行介紹,熟悉數字圖像處理的基本過程,主要包括顏色空間的基本概念、偽彩色圖像處理操作,彩色圖像處理簡單操作。 瞄準在空間域中對圖像進行增強,介紹空間濾波的機理、基本概念以及使用的基本技術。本章內容包括空間濾波基本概念、基于空間濾波的圖像平滑處理、基于空間濾波的銳化操作以及混合空間增強。 從頻域角度入手對圖像處理及增強方法展開介紹。因為頻域濾波所需的數學知識較多,所以本章采取由淺入深的策略,首先介紹一維傅里葉變換,其次介紹二維傅里葉變換和快速傅里葉變換,最后介紹圖像頻域濾波中出現的各種技術,其大體可分為低通濾波和高通濾波兩大類。 從全局特征提取和局部特征提取兩方面入手,分別介紹顏色特征、紋理特征、形狀特征、邊緣特征、點特征的提取方法。本章內容是目前機器視覺和圖像處理領域的學者關注較多的內容,通過穿插較多的實例,幫助讀者理解圖像特征提取的基本技術。 瞄準如何減少圖像傳輸及存儲數據大小,介紹主要使用的壓縮技術,包括有損壓縮和無損壓縮等,并使用JPEG壓縮技術串講全章知識點。 介紹圖像的小波域表示及多分辨率表示。
緒論
人工智能是引領未來發展的戰略性技術,是新一輪科技革命和產業變革的重要驅動力量,將深刻地改變人類社會生活。
促進人工智能和實體經濟的深度融合,構建數據驅動、人機協同、跨界融合、共創分享的智能經濟形態,更是推動質量變革、效率變革、動力變革的重要途經。
進年來,我國人工智能新技術、新產品、新業態持續涌現,與農業、制造業、服務業等行業的融合步伐明顯加快,在技術創新、應用推廣、產業發展等方面成效初顯。
人工智能技術并不是一個新生事物,它在最近幾年引起全球性關注并得到飛速發展的主要原因,在于它的三個基本要素(算法、數據、算力)的迅猛發展,其中又以數據和算力的發展尤為重要。
物聯網技術的蓬勃發展使得數據累計的難度越來越低,而芯片算力的不斷提升,使得過去只能通過云計算才能完成的人工智能運算,現在可以下沉到最普通的設備上完成。
物聯網技術為機器帶來感知能力,而人工智能則通過計算算力為機器帶來了決策能力,正如感知和大腦對自然生命進化所起到的必然性作用。
1 數字圖像處理基礎知識
https://hulin.blog.csdn.net/article/details/107570020
2 彩色圖像處理初步
https://hulin.blog.csdn.net/article/details/107578369
3 空間濾波
https://hulin.blog.csdn.net/article/details/107589248
4 頻域濾波
法國數學家傅里葉在《熱分析理論》中指出:任何周期函數都可以分解為不同頻率的正弦或余弦級數的形式,即傅里葉級數。該方法從本質上完成了空間信息到頻域信息的變換,通過變換將空間域信號處理問題轉換成頻域信號處理問題。
傅里葉變換可以將任何周期函數,分解為不同頻率的信號成分。
頻域變換為信號處理提供了不同的思路,有時在空間域無法處理的問題,通過頻域變換卻非常容易。
為了更加有效的對數字圖像進行處理,常常需要將原始圖像,以某種方式變換到另一個空間,并利用圖像在變換空間中特有的性質,對圖像信息進行加工,然后再轉換回圖像空間,就可以得到所需的效果。
圖像變換是雙向的,一般將從圖像空間轉換到其他空間的操作稱為正變換,由其他空間轉換到圖像空間稱為逆變換。
傅里葉變換將圖像看作二維信號,其水平方向和垂直方向作為二維空間的坐標軸,將圖像本身所在的域稱為空間域。
圖像灰度值隨空間坐標變換的節奏可以通過頻率度量,稱為空間頻率或者頻域。
針對數字圖像的傅里葉變換是將原始圖像通過傅里葉變換轉換到頻域,然后再頻域中對圖像進行處理的方法。
基于傅里葉變換的數字圖像頻域處理過程:首先通過正向傅里葉變換將原始圖像從空間域轉換到頻域,然后使用頻域濾波器將某些頻率過濾,保留某些特定頻率,最后使用傅里葉逆變換將濾波后的頻域圖像重新轉換到空間域,得到處理后的圖像。
相對于空間域圖像處理,頻域圖像處理有以下優點。 ① 頻域圖像處理可以通過頻域成分的特殊性質,完成一些空間域圖像處理難以完成的任務。 ② 頻域圖像處理更有利于圖像處理的解釋,可以對濾波過程中產生的某些效果做出比較直觀的解釋。 ③ 頻域濾波器可以作為空間濾波器設計的指導,通過傅里葉逆變換可以將頻域濾波器轉換為空間域變換的操作。通過頻域濾波做前期設計,然后在實施階段,用空間域濾波實現。
4.1 傅里葉變換
傅里葉變換是一種常見的正交數學變換,可以將一維信號或函數分解為具有不同頻率、不同幅度的正弦信號或余弦信號的組合 傅里葉變換的核心貢獻在于:如何求出每種正弦波或余弦波的比例或頻率,給定每種正弦波或余弦波的頻率可以恢復原始信號。 一種簡單的傅里葉變換
4.1.1 一維傅里葉變換
傅里葉變換中,一般要求要求函數f(x)滿足狄力克雷條件(在周期內存在有限個間斷點)、有限極值條件、絕對可積條件(∫?∞∞∣f(x)∣dx<+∞\int^{\infty}_{-\infty}|f(x)|dx<+\infty ∫ ? ∞ ∞ ? ∣ f ( x ) ∣ d x < + ∞ ),只有滿足這3個條件,函數的傅里葉變換才是存在的。
一個函數的傅里葉變換可以表示為 F(u)=∫?∞∞f(x)e?j2πuxdxF(u)=\int_{-\infty}^{\infty}f(x)e^{-j2\pi ux}dx F ( u ) = ∫ ? ∞ ∞ ? f ( x ) e ? j 2 π u x d x
其對應的傅里葉逆變換表示為 f(u)=∫?∞∞F(u)ej2πuxduf(u)=\int_{-\infty}^{\infty}F(u)e^{j2\pi ux}du f ( u ) = ∫ ? ∞ ∞ ? F ( u ) e j 2 π u x d u 其中j=?1,uj=\sqrt{-1},u j = ? 1 ? , u 為頻率分量
傅里葉變換中基函數的物理意義非常明確,每個基函數都是一個單頻率諧波,對應的系數(又稱頻譜)表明了原函數在此基函數上投影的大小,或者也可以看作是原函數中此種頻率諧波成分的比重。
from matplotlib
import pyplot
as plt
import numpy
as np
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( ) def show ( ori_func
, sampling_period
= 5 ) : n
= len ( ori_func
) interval
= sampling_period
/ nplt
. subplot
( 2 , 1 , 1 ) plt
. plot
( np
. arange
( 0 , sampling_period
, interval
) , ori_func
, 'black' ) plt
. xlabel
( '時間' ) , plt
. ylabel
( '振幅' ) plt
. title
( '原始信號' ) plt
. subplot
( 2 , 1 , 2 ) frequency
= np
. arange
( n
/ 2 ) / ( n
* interval
) nfft
= abs ( ft
[ range ( int ( n
/ 2 ) ) ] / n
) plt
. plot
( frequency
, nfft
, 'red' ) plt
. xlabel
( '頻率(Hz)' ) , plt
. ylabel
( '頻譜' ) plt
. title
( '傅里葉變換' ) plt
. show
( )
time
= np
. arange
( 0 , 5 , .005 )
x
= np
. sin
( 2 * np
. pi
* 1 * time
)
y
= np
. fft
. fft
( x
)
show
( x
, y
)
4.1.2 二維傅里葉變換
二維傅里葉變換本質上是將一維傅里葉變換情形向二維進行簡單擴展。 對應二維傅里葉變換的逆變換可以表示為:
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
img
= data
. camera
( )
f
= np
. fft
. fft2
( img
)
fshift
= np
. fft
. fftshift
( f
)
fimg
= np
. log
( np
. abs ( fshift
) )
plt
. subplot
( 1 , 2 , 1 ) , plt
. imshow
( img
, 'gray' ) , plt
. title
( '原始圖像' )
plt
. subplot
( 1 , 2 , 2 ) , plt
. imshow
( fimg
, 'gray' ) , plt
. title
( '傅里葉頻譜' )
plt
. show
( )
棋盤圖像對應的傅里葉變換 圖像經傅里葉變換后,直流分量與圖像均值成正比,高頻分量則表明了圖像中目標邊緣的強度及方向。
4.2 傅里葉變換的性質
4.2.1 傅里葉變換的基本性質
① 線性特性。 傅里葉變換的線性特性可以表示為:若f1(t)?F1(Ω),f2(t)?F2(Ω),則 af1(t)+bf2(t)?aF1(Ω)+bF2(Ω)。其中a、b為任意常數,利用傅里葉變換的線性特性,可以將待求信號分解為若干基本信號之和。 ② 時延特性。 時延(移位)特性說明波形在時間軸上時延,并不會改變信號幅度,僅使信號增加-Ωt0線性相位。
③ 頻移特性。 頻移(調制)特性表明信號在時域中與復因子相乘,則在頻域中將使整個頻譜搬移Ω0。 ④ 尺度變換。 尺度特性說明,信號在時域中壓縮,在頻域中擴展;反之,信號在時域中擴展,在頻域中就一定壓縮,即信號的脈寬與頻寬成反比。一般來說,時寬有限的信號,其頻寬無限,反之亦然。
針對門限函數的尺度變換及其傅里葉變換結果。 ⑤ 時域微分特性。 ⑥ 頻域微分特性。 ⑦ 對稱性。 ⑧ 時域卷積定理。 ⑨ 頻域卷積定理。
4.2.2 二維傅里葉變換的性質
相較于一維傅里葉變換,二維傅里葉變換還具有可分離性,平移特性,旋轉特性等。 ① 可分離性。 二維離散傅里葉變換(DFT),可視為由沿著x、y方向的兩個一維傅里葉變換所構成。這一性質可有效降低二維傅里葉變換的計算復雜性。
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
img_rgb
= data
. coffee
( )
img
= color
. rgb2gray
( img_rgb
)
m
, n
= img
. shape
fx
= img
for x
in range ( n
) : fx
[ : , x
] = np
. fft
. fft
( img
[ : , x
] )
for y
in range ( m
) : fx
[ y
, : ] = np
. fft
. fft
( img
[ y
, : ] )
fshift
= np
. fft
. fftshift
( fx
)
fimg
= np
. log
( np
. abs ( fshift
) )
plt
. subplot
( 121 ) , plt
. imshow
( img_rgb
, 'gray' ) , plt
. title
( '原始圖像' )
plt
. subplot
( 122 ) , plt
. imshow
( fimg
, 'gray' ) , plt
. title
( '兩次一維傅里葉變換的圖像' )
plt
. show
( )
② 平移特性。 f(x,y)在空間平移了,相當于把傅里葉變換與一個指數相乘。f(x,y)在空間與一個指數項相乘,相當于平移其傅里葉變換。 ③ 旋轉特性。 對f(x,y)旋轉一定角度,相當于將其傅里葉變換F(u,v)旋轉一定角度。
4.3 快速傅里葉變換
離散傅里葉變換已成為數字信號處理的重要工具,然而其計算量大,運算時間長,使用不夠廣泛。 快速算法大大提高了其運算速度,在某些應用場合已經可以做實時處理,并且應用在控制系統中。 快速傅里葉變換不是一種新的變換,是離散傅里葉變換的一種算法,是在分析離散傅里葉變換多余運算的基礎上,消除這些重復工作的思想指導下得到的。
4.3.1 快速傅里葉變換的原理
離散傅里葉變換的計算時間主要由乘法決定,分解后所需的乘法次數大大減少。 利用周期性和分解運算,從而減少乘法運算次數是實現快速運算的關鍵。
4.3.2 快速傅里葉變換的實現
快速傅里葉變換的基本思想:快速傅里葉變換(FFT)基于逐次倍乘法(Successive Doubling Method) 這個方法的主要思想是利用傅里葉變換(基底)的性質,將2M個數據的傅里葉變換轉化為2組M個數據的傅里葉變換。這樣,原來4*M*M的運算量就降低到2*M*M的運算量了。 這樣就可以將原來比較復雜的傅里葉運算,分解為兩個計算較簡單的傅里葉運算。且還可以繼續分解,如此循環推到下去,直到最后剩下若干組兩個點對。
4.4 圖像的頻域濾波
圖像變換是對圖像信息進行變換,使能量保持但重新分配,以利于加工處理,濾除噪聲等不必要的信息,加強、提取感興趣的部分或特征。 傅里葉變換在圖像分析、濾波、增強、壓縮等處理中有非常重要的應用。 假定原圖像f(x,y)經傅里葉變換為F(u,v),頻域增強就是選擇合適的濾波器函數H(u,v)對F(u,v)的頻譜成分進行調整,然后經傅里葉逆變換得到增強的圖像g(x,y) 可以選擇合適的頻域傳遞函數H(u,v)突出f(x,y)某方面的特征,從而得到需要的圖像g(x,y).例如,利用傳遞函數突出高頻分量,以增強圖像的邊緣信息,即高通濾波。如果突出低頻分量,就可以使圖像顯得比較平滑,即低通濾波。 頻域濾波的基本步驟如下。 (1)對原始原圖像f(x,y)進行傅里葉變換得到F(u,v) (2)將F(u,v)與傳遞函數H(u,v)進行卷積運算得到G(u,v) (3)將G(u,v)進行傅里葉逆變換得到增強圖像g(x,y) 頻域濾波的核心在于如何確定傳遞函數。
4.4.1 低通濾波
圖像從空間域變換到頻域后,其低頻分量對應圖像中灰度值變化比較緩慢的區域,高頻分量表征物體的邊緣和隨機噪聲等信息。 低頻濾波是指保留低頻分量,而通過濾波器函數H(u,v)減弱或抑制高頻分量,在頻域進行濾波。 低通濾波與空間域中的平滑濾波器一樣,可以消除圖像中的隨機噪聲,減弱邊緣效應,起到平滑圖像的作用。
第一種 理想低通濾波器
二維理想低通濾波器的傳遞函數如下。 理想低通濾波器及其圖像
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
D
= 10
new_img
= data
. coffee
( )
new_img
= color
. rgb2gray
( new_img
)
f1
= np
. fft
. fft2
( new_img
)
f1_shift
= np
. fft
. fftshift
( f1
)
rows
, cols
= new_img
. shape
crow
, ccol
= int ( rows
/ 2 ) , int ( cols
/ 2 )
mask
= np
. zeros
( ( rows
, cols
) , dtype
= 'uint8' )
for i
in range ( rows
) : for j
in range ( cols
) : if np
. sqrt
( i
* i
+ j
* j
) <= D
: mask
[ crow
- D
: crow
+ D
, ccol
- D
: ccol
+ D
] = 1
f1_shift
= f1_shift
* mask
f_ishift
= np
. fft
. ifftshift
( f1_shift
)
img_back
= np
. fft
. ifft2
( f_ishift
)
img_back
= np
. abs ( img_back
)
img_back
= ( img_back
- np
. amin
( img_back
) ) / ( np
. amax
( img_back
) - np
. amin
( img_back
) ) plt
. figure
( )
plt
. subplot
( 121 )
plt
. imshow
( new_img
, cmap
= 'gray' )
plt
. title
( '原始圖像' ) plt
. subplot
( 122 )
plt
. imshow
( img_back
, cmap
= 'gray' )
plt
. title
( '濾波后的圖像' )
plt
. show
( )
第二種 Butterworth低通濾波器
Butterworth低通濾波器的傳遞函數為
D0為截止頻率,n為函數的階。一般取使H(u,v)最大值下降到最大值的一半時的D(u,v)為截止頻率D0。
Butterworth低通濾波器的截面
與理想低通濾波器相比,高低頻之間過度較為平滑,用此濾波器后的輸出圖像振鈴現象不明顯。
n=1時,過度最平滑,即尾部包含大量的高頻成分,所以一階Butterworth低通濾波器沒有振鈴現象;但隨著n的增加,振鈴現象會越來越明顯。
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
img
= data
. coffee
( )
img
= color
. rgb2gray
( img
)
f
= np
. fft
. fft2
( img
)
fshift
= np
. fft
. fftshift
( f
)
s1
= np
. log
( np
. abs ( fshift
) ) def ButterworthPassFilter ( image
, d
, n
) : """Butterworth低通濾波器""" f
= np
. fft
. fft2
( image
) fshift
= np
. fft
. fftshift
( f
) def make_transform_matrix ( d
) : transform_matrix
= np
. zeros
( image
. shape
) center_point
= tuple ( map ( lambda x
: ( x
- 1 ) / 2 , s1
. shape
) ) for i
in range ( transform_matrix
. shape
[ 0 ] ) : for j
in range ( transform_matrix
. shape
[ 1 ] ) : def cal_distance ( pa
, pb
) : from math
import sqrtdis
= sqrt
( ( pa
[ 0 ] - pb
[ 0 ] ) ** 2 + ( pa
[ 1 ] - pb
[ 1 ] ) ** 2 ) return disdis
= cal_distance
( center_point
, ( i
, j
) ) transform_matrix
[ i
, j
] = 1 / ( 1 + ( dis
/ d
) ** ( 2 * n
) ) return transform_matrixd_matrix
= make_transform_matrix
( d
) new_img
= np
. abs ( np
. fft
. ifft2
( np
. fft
. ifftshift
( fshift
* d_matrix
) ) ) return new_imgplt
. subplot
( 221 )
plt
. axis
( 'off' )
plt
. title
( 'Original' )
plt
. imshow
( img
, cmap
= 'gray' ) plt
. subplot
( 222 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=100 n=1' )
butter_100_1
= ButterworthPassFilter
( img
, 100 , 1 )
plt
. imshow
( butter_100_1
, cmap
= 'gray' ) plt
. subplot
( 223 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=1' )
butter_30_1
= ButterworthPassFilter
( img
, 30 , 1 )
plt
. imshow
( butter_30_1
, cmap
= 'gray' ) plt
. subplot
( 224 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=5' )
butter_30_5
= ButterworthPassFilter
( img
, 30 , 5 )
plt
. imshow
( butter_30_5
, cmap
= 'gray' ) plt
. show
( )
4.4.2 高通濾波
圖像的邊緣、細節主要在高頻,圖像模糊的原因是高頻成分較弱。 為了消除模糊,突出邊緣,可以采取高通濾波的方法,使低頻分量得到抑制,從而達到增強高頻分量,使圖像的邊緣或線條變得清晰,實現圖像的銳化。
第一種 理想高通濾波
理想高通濾波器的形狀與低通濾波器的形狀正好相反。
理想高通濾波器及其圖像
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
D
= 10
new_img
= data
. coffee
( )
new_img
= color
. rgb2gray
( new_img
)
f1
= np
. fft
. fft2
( new_img
)
f1_shift
= np
. fft
. fftshift
( f1
)
"""
實現理想高通濾波器 start
"""
rows
, cols
= new_img
. shape
crow
, ccol
= int ( rows
/ 2 ) , int ( cols
/ 2 )
mask
= np
. zeros
( ( rows
, cols
) , dtype
= 'uint8' )
for i
in range ( rows
) : for j
in range ( cols
) : if np
. sqrt
( i
* i
+ j
* j
) <= D
: mask
[ crow
- D
: crow
+ D
, ccol
- D
: ccol
+ D
] = 1 mask
= 1 - mask
f1_shift
= f1_shift
* mask
"""
實現理想高通濾波器 end
"""
f_ishift
= np
. fft
. ifftshift
( f1_shift
)
img_back
= np
. fft
. ifft2
( f_ishift
)
img_back
= np
. abs ( img_back
)
img_back
= ( img_back
- np
. amin
( img_back
) ) / ( np
. amax
( img_back
) - np
. amin
( img_back
) ) plt
. figure
( )
plt
. subplot
( 121 )
plt
. axis
( 'off' )
plt
. imshow
( new_img
, cmap
= 'gray' )
plt
. title
( '原始圖像' ) plt
. subplot
( 122 )
plt
. axis
( 'off' )
plt
. imshow
( img_back
, cmap
= 'gray' )
plt
. title
( '過濾后的圖像' )
plt
. show
( )
第二種 Butterworth高通濾波
Butterworth高通濾波器的形狀與Butterworth低通濾波器的形狀相反,因為高低頻率間平滑過渡,因此振鈴現象不明顯。
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
img
= data
. coffee
( )
img
= color
. rgb2gray
( img
)
f
= np
. fft
. fft2
( img
)
fshift
= np
. fft
. fftshift
( f
)
s1
= np
. log
( np
. abs ( fshift
) ) def ButterworthPassFilter ( image
, d
, n
) : """Butterworth 高通濾波器""" f
= np
. fft
. fft2
( image
) fshift
= np
. fft
. fftshift
( f
) def make_transform_matrix ( d
) : transform_matrix
= np
. zeros
( image
. shape
) center_point
= tuple ( map ( lambda x
: ( x
- 1 ) / 2 , s1
. shape
) ) for i
in range ( transform_matrix
. shape
[ 0 ] ) : for j
in range ( transform_matrix
. shape
[ 1 ] ) : def cal_distance ( pa
, pb
) : from math
import sqrtdis
= sqrt
( ( pa
[ 0 ] - pb
[ 0 ] ) ** 2 + ( pa
[ 1 ] - pb
[ 1 ] ) ** 2 ) return disdis
= cal_distance
( center_point
, ( i
, j
) ) transform_matrix
[ i
, j
] = 1 / ( 1 + ( dis
/ d
) ** ( 2 * n
) ) return transform_matrixd_matrix
= make_transform_matrix
( d
) d_matrix
= 1 - d_matrixnew_img
= np
. abs ( np
. fft
. ifft2
( np
. fft
. ifftshift
( fshift
* d_matrix
) ) ) return new_imgplt
. subplot
( 221 )
plt
. axis
( 'off' )
plt
. title
( 'Original' )
plt
. imshow
( img
, cmap
= 'gray' ) plt
. subplot
( 222 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=100 n=1' )
butter_100_1
= ButterworthPassFilter
( img
, 100 , 1 )
plt
. imshow
( butter_100_1
, cmap
= 'gray' ) plt
. subplot
( 223 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=1' )
butter_30_1
= ButterworthPassFilter
( img
, 30 , 1 )
plt
. imshow
( butter_30_1
, cmap
= 'gray' ) plt
. subplot
( 224 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=5' )
butter_30_5
= ButterworthPassFilter
( img
, 30 , 5 )
plt
. imshow
( butter_30_5
, cmap
= 'gray' ) plt
. show
( )
第三種 高頻增強濾波器
高頻濾波將低頻分量濾掉,導致增強圖像中的邊緣得到加強,但平坦區域灰度很暗,接近黑色。 高頻增強濾波器對頻域里的高通濾波器的轉移函數加一個常數,將一些低頻分量加回去,保持光滑區域的灰度,又改善邊緣區域的對比度。 高頻增強轉移函數為He(u,v)=k*H(u,v)+c 這樣就可以做到在原始圖像的基礎上疊加一些高頻成分,既保留了原圖的灰度層次,又銳化了邊緣
from matplotlib
import pyplot
as plt
import numpy
as np
from skimage
import data
, color
def set_ch ( ) : from pylab
import mplmpl
. rcParams
[ 'font.sans-serif' ] = [ 'FangSong' ] mpl
. rcParams
[ 'axes.unicode_minus' ] = False set_ch
( )
img
= data
. coffee
( )
img
= color
. rgb2gray
( img
)
f
= np
. fft
. fft2
( img
)
fshift
= np
. fft
. fftshift
( f
)
s1
= np
. log
( np
. abs ( fshift
) ) def ButterworthPassFilter ( image
, d
, n
) : """Butterworth 高通濾波器""" f
= np
. fft
. fft2
( image
) fshift
= np
. fft
. fftshift
( f
) def make_transform_matrix ( d
) : transform_matrix
= np
. zeros
( image
. shape
) center_point
= tuple ( map ( lambda x
: ( x
- 1 ) / 2 , s1
. shape
) ) for i
in range ( transform_matrix
. shape
[ 0 ] ) : for j
in range ( transform_matrix
. shape
[ 1 ] ) : def cal_distance ( pa
, pb
) : from math
import sqrtdis
= sqrt
( ( pa
[ 0 ] - pb
[ 0 ] ) ** 2 + ( pa
[ 1 ] - pb
[ 1 ] ) ** 2 ) return disdis
= cal_distance
( center_point
, ( i
, j
) ) transform_matrix
[ i
, j
] = 1 / ( 1 + ( dis
/ d
) ** ( 2 * n
) ) return transform_matrixd_matrix
= make_transform_matrix
( d
) d_matrix
= d_matrix
+ 0.5 new_img
= np
. abs ( np
. fft
. ifft2
( np
. fft
. ifftshift
( fshift
* d_matrix
) ) ) return new_imgplt
. subplot
( 221 )
plt
. axis
( 'off' )
plt
. title
( 'Original' )
plt
. imshow
( img
, cmap
= 'gray' ) plt
. subplot
( 222 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=100 n=1' )
butter_100_1
= ButterworthPassFilter
( img
, 100 , 1 )
plt
. imshow
( butter_100_1
, cmap
= 'gray' ) plt
. subplot
( 223 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=1' )
butter_30_1
= ButterworthPassFilter
( img
, 30 , 1 )
plt
. imshow
( butter_30_1
, cmap
= 'gray' ) plt
. subplot
( 224 )
plt
. axis
( 'off' )
plt
. title
( 'Butter D=30 n=5' )
butter_30_5
= ButterworthPassFilter
( img
, 30 , 5 )
plt
. imshow
( butter_30_5
, cmap
= 'gray' ) plt
. show
( )
4.5 小結
本章主要介紹頻域圖像處理,首先介紹了傅里葉變換及其基本性質,其次介紹了快速傅里葉變換,最后介紹了頻域濾波相關技術。
參考資料
岳亞偉《數字圖像處理與Python實現》人民郵電出版社
與50位技術專家面對面 20年技術見證,附贈技術全景圖
總結
以上是生活随笔 為你收集整理的数字图像处理与Python实现笔记之频域滤波 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。