生活随笔
收集整理的這篇文章主要介紹了
数字图像处理与Python实现笔记之频域滤波
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)字圖像處理與Python實現(xiàn)筆記 摘要 緒論 1 數(shù)字圖像處理基礎(chǔ)知識 2 彩色圖像處理初步 3 空間濾波 4 頻域濾波 4.1 傅里葉變換 4.1.1 一維傅里葉變換 4.1.2 二維傅里葉變換 4.2 傅里葉變換的性質(zhì) 4.2.1 傅里葉變換的基本性質(zhì) 4.2.2 二維傅里葉變換的性質(zhì) 4.3 快速傅里葉變換 4.3.1 快速傅里葉變換的原理 4.3.2 快速傅里葉變換的實現(xiàn) 4.4 圖像的頻域濾波 4.4.1 低通濾波 第一種 理想低通濾波器 第二種 Butterworth低通濾波器 4.4.2 高通濾波 第一種 理想高通濾波 第二種 Butterworth高通濾波 第三種 高頻增強(qiáng)濾波器 4.5 小結(jié) 參考資料
摘要
簡要介紹數(shù)字圖像處理涉及的一些基本概念、基本運(yùn)算、基本類型,以及如何通過Python對數(shù)字圖像進(jìn)行讀取和簡單操作。 以彩色圖像為例對數(shù)字圖像處理的基本操作進(jìn)行介紹,熟悉數(shù)字圖像處理的基本過程,主要包括顏色空間的基本概念、偽彩色圖像處理操作,彩色圖像處理簡單操作。 瞄準(zhǔn)在空間域中對圖像進(jìn)行增強(qiáng),介紹空間濾波的機(jī)理、基本概念以及使用的基本技術(shù)。本章內(nèi)容包括空間濾波基本概念、基于空間濾波的圖像平滑處理、基于空間濾波的銳化操作以及混合空間增強(qiáng)。 從頻域角度入手對圖像處理及增強(qiáng)方法展開介紹。因為頻域濾波所需的數(shù)學(xué)知識較多,所以本章采取由淺入深的策略,首先介紹一維傅里葉變換,其次介紹二維傅里葉變換和快速傅里葉變換,最后介紹圖像頻域濾波中出現(xiàn)的各種技術(shù),其大體可分為低通濾波和高通濾波兩大類。 從全局特征提取和局部特征提取兩方面入手,分別介紹顏色特征、紋理特征、形狀特征、邊緣特征、點特征的提取方法。本章內(nèi)容是目前機(jī)器視覺和圖像處理領(lǐng)域的學(xué)者關(guān)注較多的內(nèi)容,通過穿插較多的實例,幫助讀者理解圖像特征提取的基本技術(shù)。 瞄準(zhǔn)如何減少圖像傳輸及存儲數(shù)據(jù)大小,介紹主要使用的壓縮技術(shù),包括有損壓縮和無損壓縮等,并使用JPEG壓縮技術(shù)串講全章知識點。 介紹圖像的小波域表示及多分辨率表示。
緒論
人工智能是引領(lǐng)未來發(fā)展的戰(zhàn)略性技術(shù),是新一輪科技革命和產(chǎn)業(yè)變革的重要驅(qū)動力量,將深刻地改變?nèi)祟惿鐣睢?/p>
促進(jìn)人工智能和實體經(jīng)濟(jì)的深度融合,構(gòu)建數(shù)據(jù)驅(qū)動、人機(jī)協(xié)同、跨界融合、共創(chuàng)分享的智能經(jīng)濟(jì)形態(tài),更是推動質(zhì)量變革、效率變革、動力變革的重要途經(jīng)。
進(jìn)年來,我國人工智能新技術(shù)、新產(chǎn)品、新業(yè)態(tài)持續(xù)涌現(xiàn),與農(nóng)業(yè)、制造業(yè)、服務(wù)業(yè)等行業(yè)的融合步伐明顯加快,在技術(shù)創(chuàng)新、應(yīng)用推廣、產(chǎn)業(yè)發(fā)展等方面成效初顯。
人工智能技術(shù)并不是一個新生事物,它在最近幾年引起全球性關(guān)注并得到飛速發(fā)展的主要原因,在于它的三個基本要素(算法、數(shù)據(jù)、算力)的迅猛發(fā)展,其中又以數(shù)據(jù)和算力的發(fā)展尤為重要。
物聯(lián)網(wǎng)技術(shù)的蓬勃發(fā)展使得數(shù)據(jù)累計的難度越來越低,而芯片算力的不斷提升,使得過去只能通過云計算才能完成的人工智能運(yùn)算,現(xiàn)在可以下沉到最普通的設(shè)備上完成。
物聯(lián)網(wǎng)技術(shù)為機(jī)器帶來感知能力,而人工智能則通過計算算力為機(jī)器帶來了決策能力,正如感知和大腦對自然生命進(jìn)化所起到的必然性作用。
1 數(shù)字圖像處理基礎(chǔ)知識
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 頻域濾波
法國數(shù)學(xué)家傅里葉在《熱分析理論》中指出:任何周期函數(shù)都可以分解為不同頻率的正弦或余弦級數(shù)的形式,即傅里葉級數(shù)。該方法從本質(zhì)上完成了空間信息到頻域信息的變換,通過變換將空間域信號處理問題轉(zhuǎn)換成頻域信號處理問題。
傅里葉變換可以將任何周期函數(shù),分解為不同頻率的信號成分。
頻域變換為信號處理提供了不同的思路,有時在空間域無法處理的問題,通過頻域變換卻非常容易。
為了更加有效的對數(shù)字圖像進(jìn)行處理,常常需要將原始圖像,以某種方式變換到另一個空間,并利用圖像在變換空間中特有的性質(zhì),對圖像信息進(jìn)行加工,然后再轉(zhuǎn)換回圖像空間,就可以得到所需的效果。
圖像變換是雙向的,一般將從圖像空間轉(zhuǎn)換到其他空間的操作稱為正變換,由其他空間轉(zhuǎn)換到圖像空間稱為逆變換。
傅里葉變換將圖像看作二維信號,其水平方向和垂直方向作為二維空間的坐標(biāo)軸,將圖像本身所在的域稱為空間域。
圖像灰度值隨空間坐標(biāo)變換的節(jié)奏可以通過頻率度量,稱為空間頻率或者頻域。
針對數(shù)字圖像的傅里葉變換是將原始圖像通過傅里葉變換轉(zhuǎn)換到頻域,然后再頻域中對圖像進(jìn)行處理的方法。
基于傅里葉變換的數(shù)字圖像頻域處理過程:首先通過正向傅里葉變換將原始圖像從空間域轉(zhuǎn)換到頻域,然后使用頻域濾波器將某些頻率過濾,保留某些特定頻率,最后使用傅里葉逆變換將濾波后的頻域圖像重新轉(zhuǎn)換到空間域,得到處理后的圖像。
相對于空間域圖像處理,頻域圖像處理有以下優(yōu)點。 ① 頻域圖像處理可以通過頻域成分的特殊性質(zhì),完成一些空間域圖像處理難以完成的任務(wù)。 ② 頻域圖像處理更有利于圖像處理的解釋,可以對濾波過程中產(chǎn)生的某些效果做出比較直觀的解釋。 ③ 頻域濾波器可以作為空間濾波器設(shè)計的指導(dǎo),通過傅里葉逆變換可以將頻域濾波器轉(zhuǎn)換為空間域變換的操作。通過頻域濾波做前期設(shè)計,然后在實施階段,用空間域濾波實現(xiàn)。
4.1 傅里葉變換
傅里葉變換是一種常見的正交數(shù)學(xué)變換,可以將一維信號或函數(shù)分解為具有不同頻率、不同幅度的正弦信號或余弦信號的組合 傅里葉變換的核心貢獻(xiàn)在于:如何求出每種正弦波或余弦波的比例或頻率,給定每種正弦波或余弦波的頻率可以恢復(fù)原始信號。 一種簡單的傅里葉變換
4.1.1 一維傅里葉變換
傅里葉變換中,一般要求要求函數(shù)f(x)滿足狄力克雷條件(在周期內(nèi)存在有限個間斷點)、有限極值條件、絕對可積條件(∫?∞∞∣f(x)∣dx<+∞\int^{\infty}_{-\infty}|f(x)|dx<+\infty ∫ ? ∞ ∞ ? ∣ f ( x ) ∣ d x < + ∞ ),只有滿足這3個條件,函數(shù)的傅里葉變換才是存在的。
一個函數(shù)的傅里葉變換可以表示為 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
其對應(yīng)的傅里葉逆變換表示為 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 為頻率分量
傅里葉變換中基函數(shù)的物理意義非常明確,每個基函數(shù)都是一個單頻率諧波,對應(yīng)的系數(shù)(又稱頻譜)表明了原函數(shù)在此基函數(shù)上投影的大小,或者也可以看作是原函數(shù)中此種頻率諧波成分的比重。
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 二維傅里葉變換
二維傅里葉變換本質(zhì)上是將一維傅里葉變換情形向二維進(jìn)行簡單擴(kuò)展。 對應(yīng)二維傅里葉變換的逆變換可以表示為:
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
( )
棋盤圖像對應(yīng)的傅里葉變換 圖像經(jīng)傅里葉變換后,直流分量與圖像均值成正比,高頻分量則表明了圖像中目標(biāo)邊緣的強(qiáng)度及方向。
4.2 傅里葉變換的性質(zhì)
4.2.1 傅里葉變換的基本性質(zhì)
① 線性特性。 傅里葉變換的線性特性可以表示為:若f1(t)?F1(Ω),f2(t)?F2(Ω),則 af1(t)+bf2(t)?aF1(Ω)+bF2(Ω)。其中a、b為任意常數(shù),利用傅里葉變換的線性特性,可以將待求信號分解為若干基本信號之和。 ② 時延特性。 時延(移位)特性說明波形在時間軸上時延,并不會改變信號幅度,僅使信號增加-Ωt0線性相位。
③ 頻移特性。 頻移(調(diào)制)特性表明信號在時域中與復(fù)因子相乘,則在頻域中將使整個頻譜搬移Ω0。 ④ 尺度變換。 尺度特性說明,信號在時域中壓縮,在頻域中擴(kuò)展;反之,信號在時域中擴(kuò)展,在頻域中就一定壓縮,即信號的脈寬與頻寬成反比。一般來說,時寬有限的信號,其頻寬無限,反之亦然。
針對門限函數(shù)的尺度變換及其傅里葉變換結(jié)果。 ⑤ 時域微分特性。 ⑥ 頻域微分特性。 ⑦ 對稱性。 ⑧ 時域卷積定理。 ⑨ 頻域卷積定理。
4.2.2 二維傅里葉變換的性質(zhì)
相較于一維傅里葉變換,二維傅里葉變換還具有可分離性,平移特性,旋轉(zhuǎn)特性等。 ① 可分離性。 二維離散傅里葉變換(DFT),可視為由沿著x、y方向的兩個一維傅里葉變換所構(gòu)成。這一性質(zhì)可有效降低二維傅里葉變換的計算復(fù)雜性。
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)在空間平移了,相當(dāng)于把傅里葉變換與一個指數(shù)相乘。f(x,y)在空間與一個指數(shù)項相乘,相當(dāng)于平移其傅里葉變換。 ③ 旋轉(zhuǎn)特性。 對f(x,y)旋轉(zhuǎn)一定角度,相當(dāng)于將其傅里葉變換F(u,v)旋轉(zhuǎn)一定角度。
4.3 快速傅里葉變換
離散傅里葉變換已成為數(shù)字信號處理的重要工具,然而其計算量大,運(yùn)算時間長,使用不夠廣泛。 快速算法大大提高了其運(yùn)算速度,在某些應(yīng)用場合已經(jīng)可以做實時處理,并且應(yīng)用在控制系統(tǒng)中。 快速傅里葉變換不是一種新的變換,是離散傅里葉變換的一種算法,是在分析離散傅里葉變換多余運(yùn)算的基礎(chǔ)上,消除這些重復(fù)工作的思想指導(dǎo)下得到的。
4.3.1 快速傅里葉變換的原理
離散傅里葉變換的計算時間主要由乘法決定,分解后所需的乘法次數(shù)大大減少。 利用周期性和分解運(yùn)算,從而減少乘法運(yùn)算次數(shù)是實現(xiàn)快速運(yùn)算的關(guān)鍵。
4.3.2 快速傅里葉變換的實現(xiàn)
快速傅里葉變換的基本思想:快速傅里葉變換(FFT)基于逐次倍乘法(Successive Doubling Method) 這個方法的主要思想是利用傅里葉變換(基底)的性質(zhì),將2M個數(shù)據(jù)的傅里葉變換轉(zhuǎn)化為2組M個數(shù)據(jù)的傅里葉變換。這樣,原來4*M*M的運(yùn)算量就降低到2*M*M的運(yùn)算量了。 這樣就可以將原來比較復(fù)雜的傅里葉運(yùn)算,分解為兩個計算較簡單的傅里葉運(yùn)算。且還可以繼續(xù)分解,如此循環(huán)推到下去,直到最后剩下若干組兩個點對。
4.4 圖像的頻域濾波
圖像變換是對圖像信息進(jìn)行變換,使能量保持但重新分配,以利于加工處理,濾除噪聲等不必要的信息,加強(qiáng)、提取感興趣的部分或特征。 傅里葉變換在圖像分析、濾波、增強(qiáng)、壓縮等處理中有非常重要的應(yīng)用。 假定原圖像f(x,y)經(jīng)傅里葉變換為F(u,v),頻域增強(qiáng)就是選擇合適的濾波器函數(shù)H(u,v)對F(u,v)的頻譜成分進(jìn)行調(diào)整,然后經(jīng)傅里葉逆變換得到增強(qiáng)的圖像g(x,y) 可以選擇合適的頻域傳遞函數(shù)H(u,v)突出f(x,y)某方面的特征,從而得到需要的圖像g(x,y).例如,利用傳遞函數(shù)突出高頻分量,以增強(qiáng)圖像的邊緣信息,即高通濾波。如果突出低頻分量,就可以使圖像顯得比較平滑,即低通濾波。 頻域濾波的基本步驟如下。 (1)對原始原圖像f(x,y)進(jìn)行傅里葉變換得到F(u,v) (2)將F(u,v)與傳遞函數(shù)H(u,v)進(jìn)行卷積運(yùn)算得到G(u,v) (3)將G(u,v)進(jìn)行傅里葉逆變換得到增強(qiáng)圖像g(x,y) 頻域濾波的核心在于如何確定傳遞函數(shù)。
4.4.1 低通濾波
圖像從空間域變換到頻域后,其低頻分量對應(yīng)圖像中灰度值變化比較緩慢的區(qū)域,高頻分量表征物體的邊緣和隨機(jī)噪聲等信息。 低頻濾波是指保留低頻分量,而通過濾波器函數(shù)H(u,v)減弱或抑制高頻分量,在頻域進(jìn)行濾波。 低通濾波與空間域中的平滑濾波器一樣,可以消除圖像中的隨機(jī)噪聲,減弱邊緣效應(yīng),起到平滑圖像的作用。
第一種 理想低通濾波器
二維理想低通濾波器的傳遞函數(shù)如下。 理想低通濾波器及其圖像
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低通濾波器的傳遞函數(shù)為
D0為截止頻率,n為函數(shù)的階。一般取使H(u,v)最大值下降到最大值的一半時的D(u,v)為截止頻率D0。
Butterworth低通濾波器的截面
與理想低通濾波器相比,高低頻之間過度較為平滑,用此濾波器后的輸出圖像振鈴現(xiàn)象不明顯。
n=1時,過度最平滑,即尾部包含大量的高頻成分,所以一階Butterworth低通濾波器沒有振鈴現(xiàn)象;但隨著n的增加,振鈴現(xià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 高通濾波
圖像的邊緣、細(xì)節(jié)主要在高頻,圖像模糊的原因是高頻成分較弱。 為了消除模糊,突出邊緣,可以采取高通濾波的方法,使低頻分量得到抑制,從而達(dá)到增強(qiáng)高頻分量,使圖像的邊緣或線條變得清晰,實現(xià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
( )
D
= 10
new_img
= data
. coffee
( )
new_img
= color
. rgb2gray
( new_img
)
f1
= np
. fft
. fft2
( new_img
)
f1_shift
= np
. fft
. fftshift
( f1
)
"""
實現(xiàn)理想高通濾波器 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
"""
實現(xiàn)理想高通濾波器 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低通濾波器的形狀相反,因為高低頻率間平滑過渡,因此振鈴現(xià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
) 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
( )
第三種 高頻增強(qiáng)濾波器
高頻濾波將低頻分量濾掉,導(dǎo)致增強(qiáng)圖像中的邊緣得到加強(qiáng),但平坦區(qū)域灰度很暗,接近黑色。 高頻增強(qiáng)濾波器對頻域里的高通濾波器的轉(zhuǎn)移函數(shù)加一個常數(shù),將一些低頻分量加回去,保持光滑區(qū)域的灰度,又改善邊緣區(qū)域的對比度。 高頻增強(qiáng)轉(zhuǎn)移函數(shù)為He(u,v)=k*H(u,v)+c 這樣就可以做到在原始圖像的基礎(chǔ)上疊加一些高頻成分,既保留了原圖的灰度層次,又銳化了邊緣
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
( )
二維圖像的高頻增強(qiáng)濾波結(jié)果
4.5 小結(jié)
本章主要介紹頻域圖像處理,首先介紹了傅里葉變換及其基本性質(zhì),其次介紹了快速傅里葉變換,最后介紹了頻域濾波相關(guān)技術(shù)。
參考資料
岳亞偉《數(shù)字圖像處理與Python實現(xiàn)》人民郵電出版社
與50位技術(shù)專家面對面 20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔 為你收集整理的数字图像处理与Python实现笔记之频域滤波 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。