專欄地址:『youcans 的圖像處理學(xué)習(xí)課』
文章目錄:『youcans 的圖像處理學(xué)習(xí)課 - 總目錄』
1. 小波變換
1.1 小波變換基本概念
信號(hào)變換是為了分析時(shí)間和頻率之間的相互關(guān)系。
傅里葉變換(FFT)將信號(hào)表示為無(wú)限三角函數(shù)的疊加,從而將信號(hào)從時(shí)域轉(zhuǎn)換到頻域,可以分析信號(hào)的頻譜,但不能反映信號(hào)的時(shí)頻特征,丟失了局部信息。
短時(shí)傅里葉變換(STFT)通過(guò)引入時(shí)間窗獲得信號(hào)的時(shí)頻譜圖,但窗口尺寸是固定的,不能兼顧頻域信息與時(shí)域信息,即不能同時(shí)對(duì)高頻和低頻進(jìn)行精確分析。
小波變換以尺度函數(shù)(scaling)和小波函數(shù)(wavelet function)作為基函數(shù)進(jìn)行信號(hào)分解。縮放母小波的寬度獲得信號(hào)的頻域特征,通過(guò)平移母小波獲得信號(hào)的時(shí)間信息。
小波函數(shù)是定義在有限間隔且均值為0的一種函數(shù)。使用有限長(zhǎng)的衰減的小波基, 既包含了頻率的信息,也包含了時(shí)間的信息 。小波函數(shù)的尺度對(duì)應(yīng)于頻率,控制小波函數(shù)的伸縮,平移量對(duì)應(yīng)于時(shí)間,控制小波函數(shù)的平移。
小波族類的產(chǎn)生只需要滿足兩個(gè)條件:歸一化約束和正交化約束。因此小波有很多族類, 每個(gè)小波族在小波的緊湊性和平滑性做出了不同的權(quán)衡,對(duì)應(yīng)著不同的形狀、光滑度和緊密型,應(yīng)用于不同的場(chǎng)景和狀況。
例程 17_1:常用小波族的圖像
import pywt
print(pywt.families(short=False))
# 顯示的結(jié)果
['Haar', 'Daubechies', 'Symlets', 'Coiflets', 'Biorthogonal', 'Reverse biorthogonal',
'Discrete Meyer (FIR Approximation)', 'Gaussian', 'Mexican hat wavelet', 'Morlet wavelet',
'Complex Gaussian wavelets', 'Shannon wavelets', 'Frequency B-Spline wavelets', 'Complex Morlet wavelets']
運(yùn)行結(jié)果:
[‘Haar’, ‘Daubechies’, ‘Symlets’, ‘Coiflets’, ‘Biorthogonal’, ‘Reverse biorthogonal’, ‘Discrete Meyer (FIR Approximation)’, ‘Gaussian’, ‘Mexican hat wavelet’, ‘Morlet wavelet’, ‘Complex Gaussian wavelets’, ‘Shannon wavelets’, ‘Frequency B-Spline wavelets’, ‘Complex Morlet wavelets’]
1.2 連續(xù)小波變換
傅里葉變換將信號(hào) f ( t ) f(t) f(t)分解為一系列不同頻率的正弦信號(hào)的疊加,傅里葉系數(shù)對(duì)應(yīng)于不同正弦信號(hào)的幅值。小波變換將信號(hào) f ( t ) f(t) f(t)分解為一系列小波信號(hào)的疊加,產(chǎn)生一系列小波信號(hào)的基本小波可以根據(jù)需要來(lái)選擇或設(shè)計(jì)。
連續(xù)小波變換為:
γ
(
s
,
τ
)
=
∫
f
(
t
)
Ψ
s
,
τ
?
(
t
)
d
t
\gamma (s,\tau) = \int f(t) \Psi ^* _{s,\tau} (t) dt
γ(s,τ)=∫f(t)Ψs,τ??(t)dt
連續(xù)小波變換的逆變換為:
f
(
t
)
=
∫
∫
γ
(
s
,
τ
)
Ψ
s
,
τ
(
t
)
d
s
d
t
f(t) = \int \int \gamma (s,\tau) \Psi _{s,\tau} (t) dsdt
f(t)=∫∫γ(s,τ)Ψs,τ?(t)dsdt
其中,* 表示復(fù)共軛,
Ψ
s
,
τ
(
t
)
\Psi _{s,\tau} (t)
Ψs,τ?(t)為小波基函數(shù)(basic wavelet)。
不同小波基函數(shù),都是由同一個(gè)基本小波(母小波)
Ψ
(
t
)
\Psi (t)
Ψ(t) 經(jīng)過(guò)縮放和平移產(chǎn)生。
Ψ
s
,
τ
(
t
)
=
1
s
Ψ
(
t
?
τ
s
)
\Psi _{s,\tau} (t) = \frac{1}{\sqrt {s}} \Psi (\frac {t-\tau}{s})
Ψs,τ?(t)=s?1?Ψ(st?τ?)
離散小波變換,通過(guò)二進(jìn)小波變換(縮放因子取為2)把由基本小波生成小波基函數(shù)的方法表示為:
Ψ
j
,
k
(
x
)
=
2
j
/
2
?
Ψ
(
2
j
x
?
k
)
,
k
=
0
,
.
.
.
2
j
?
1
\Psi_{j,k}(x) = 2^{j/2} * \Psi(2^j x-k) , \quad k=0,...2^j-1
Ψj,k?(x)=2j/2?Ψ(2jx?k),k=0,...2j?1
其中j決定縮放系數(shù),k決定平移幅度。
在圖像處理中,離散小波變換將圖像分解為大小、位置和方向都不同的分量。對(duì)圖像進(jìn)行小波分解后,可以得到一系列不同分辨率的子圖像,構(gòu)造出圖像金字塔。
小波變換中,縮放因子scale越小,表示小波越窄,對(duì)應(yīng)的信號(hào)頻率越高,反映的是信號(hào)的細(xì)節(jié)變化;縮放因子越大,表示小波越寬,對(duì)應(yīng)的信號(hào)頻率越低,反映的是信號(hào)的輪廓變化。
1.3 離散小波變換(Discrete wavelet transform, DWT)
雙通道子帶編碼通過(guò)兩個(gè)互補(bǔ)的濾波器組:
- 低通濾波器,得到信號(hào)的近似值A(chǔ),相當(dāng)于小波伸展,獲得當(dāng)前信號(hào)的低頻特征,反映輪廓特征;
- 高通濾波器,得到信號(hào)的細(xì)節(jié)值D,相當(dāng)于小波伸縮,獲得當(dāng)前信號(hào)的高頻特征,反映細(xì)節(jié)特征。
實(shí)際應(yīng)用中,信號(hào)的低頻特征最重要,高頻分量只起細(xì)化修飾的作用。
小波變換可以表示為由低通濾波器和高通濾波器組成的一棵樹(shù)。原始信號(hào)經(jīng)過(guò)一對(duì)互補(bǔ)的濾波器組進(jìn)行的分解稱為一級(jí)分解,繼續(xù)下去可以進(jìn)行多級(jí)分解。
如果對(duì)信號(hào)的高頻分量不再分解,而對(duì)低頻分量進(jìn)行連續(xù)分解,可以得到信號(hào)在不同分辨率下的低頻分量。
1.4 二維離散小波變換
圖像是典型的二維離散信號(hào)。將一維離散小波變換開(kāi)展到二維函數(shù),就能實(shí)現(xiàn)圖像的二維離散小波變換。
在二維情況下,每個(gè)二維小波都是兩個(gè)一維小波的積,產(chǎn)生 4 個(gè)可分離的尺度函數(shù):
φ
(
x
,
y
)
=
φ
(
x
)
φ
(
y
)
Ψ
H
(
x
,
y
)
=
Ψ
(
x
)
φ
(
y
)
Ψ
V
(
x
,
y
)
=
φ
(
x
)
Ψ
(
y
)
Ψ
D
(
x
,
y
)
=
Ψ
(
x
)
Ψ
(
y
)
\varphi (x,y) = \varphi (x) \varphi (y)\\ \varPsi ^H(x,y) = \varPsi (x) \varphi (y)\\ \varPsi ^V(x,y) = \varphi (x) \varPsi (y) \\ \varPsi ^D(x,y) = \varPsi (x) \varPsi (y)
φ(x,y)=φ(x)φ(y)ΨH(x,y)=Ψ(x)φ(y)ΨV(x,y)=φ(x)Ψ(y)ΨD(x,y)=Ψ(x)Ψ(y)
這些小波度量圖像中灰度沿不同方向的變化:
- Ψ H ( x , y ) \varPsi ^H(x,y) ΨH(x,y) 響應(yīng)列的變化(水平邊緣)。
- Ψ V ( x , y ) \varPsi ^V(x,y) ΨV(x,y) 響應(yīng)行的變化(垂直邊緣)。
- Ψ D ( x , y ) \varPsi ^D(x,y) ΨD(x,y) 響應(yīng)對(duì)角線的變化。
例程 17_3:圖像的小波變換
import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt
if __name__ == '__main__':
# (3) 圖像的二維小波變換
img = cv.imread("../images/Fig0515a.tif", flags=0)
img = cv.resize(img, (512, 512)).astype(np.float32)
coeffs = pywt.dwt2(img, 'haar')
cA, (cH, cV, cD) = coeffs # 低頻分量,(水平高頻,垂直高頻,對(duì)角線高頻)
# 拼接子圖
AH = np.concatenate([cA, cH], axis=1)
VD = np.concatenate([cV, cD], axis=1)
dwt1 = np.concatenate([AH, VD], axis=0)
print(img.shape, dwt1.shape)
# 顯示為灰度圖
plt.imshow(dwt1, 'gray')
plt.title('DWT'), plt.xticks([]), plt.yticks([])
plt.show()
2. Haar 小波變換
2.1 Haar 小波變換的基本概念
Haar 變換又稱 Haar 小波變換,由 Alfred Haar于1910年提出,是最早提出的正交小波,也是唯一既具有對(duì)稱性又是有限支撐的正交小波。
Haar 小波函數(shù)是最簡(jiǎn)單的基函數(shù),是一組分段的常值函數(shù)組成的函數(shù)集合。這個(gè)函數(shù)集定義在半開(kāi)區(qū)間[0,1)上,每個(gè)分段常值函數(shù)的數(shù)值在一個(gè)小范圍為 1 而在其它區(qū)域?yàn)?0。
Haar小波的母小波(mother wavelet)表示為:
Ψ ( x ) = { 1 , 0 ≤ x < 1 / 2 ? 1 , 1 / 2 ≤ x < 1 0 , o t h e r w i s e \Psi(x) = \begin{cases} \begin{aligned} 1 , \quad &0 \le x \lt 1/2\\ -1 , \quad &1/2 \le x \lt 1\\ 0 , \quad & otherwise \end{aligned} \end{cases} Ψ(x)=? ? ??1,?1,0,?0≤x<1/21/2≤x<1otherwise??
對(duì)應(yīng)的尺度函數(shù)(scaling function)表示為:
? ( x ) = { 1 , 0 ≤ t < 1 0 , o t h e r w i s e \phi(x) = \begin{cases} \begin{aligned} 1 , \quad &0 \le t \lt 1\\ 0 , \quad & otherwise \end{aligned} \end{cases} ?(x)={1,0,?0≤t<1otherwise??
其濾波器 h[n]定義為:
h [ n ] = { 1 / 2 , n = 0 , 1 0 , o t h e r w i s e h[n] = \begin{cases} \begin{aligned} 1 / \sqrt{2} , \quad & n=0,1\\ 0 , \quad & otherwise \end{aligned} \end{cases} h[n]={1/2?,0,?n=0,1otherwise??
因此,
Ψ ( t / 2 ) = 2 ∑ n = ? ∞ ∞ ( ? 1 ) 1 ? n ? h [ 1 ? n ] ? ? ( t ? n ) = ? ( t ? 1 ) ? ? ( t ) \begin{aligned} \Psi (t/2) &= \sqrt{2} \sum _{n=-\infty} ^{\infty} (-1)^{1-n}*h[1-n]*\phi (t-n)\\ &= \phi (t-1) - \phi (t) \end{aligned} Ψ(t/2)?=2?n=?∞∑∞?(?1)1?n?h[1?n]??(t?n)=?(t?1)??(t)?
即:
Ψ i j ( x ) = Ψ ( 2 j ? x ? i ) , i = 0 , . . . ( 2 j ? 1 ) \Psi_i^j(x) = \Psi(2^j*x-i) , i=0,...(2^j-1)\\ Ψij?(x)=Ψ(2j?x?i),i=0,...(2j?1)
Ψ ( x ) = ? ( 2 x ) ? ? ( 2 x ? 1 ) \Psi(x) = \phi(2x) - \phi(2x-1) Ψ(x)=?(2x)??(2x?1)
Haar 基函數(shù)可以獲取信號(hào)的尺度信息,而 Haar 小波函數(shù)可以表示信號(hào)的細(xì)節(jié)信息。
Haar 小波具有如下特點(diǎn):
(1)Haar 小波在時(shí)域是緊支撐的,即其非零區(qū)間為 [0,1)
(2)Haar 小波屬于正交小波。
(3)Haar 小波是對(duì)稱的。
(4)Haar 小波僅取 +1 和 -1,計(jì)算簡(jiǎn)單。
(5)Haar 小波是不連續(xù)小波,在實(shí)際的信號(hào)分析與處理中受到了限制。
例程 17_4:一維信號(hào)的 Haar 小波分解
對(duì)一維 Chirp 信號(hào)進(jìn)行 Haar 小波變換的例程和結(jié)果如下。
import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt
if __name__ == '__main__':
# (4) Chirp 信號(hào)的 Haar 小波分解
x = np.linspace(0, 1, num=2048)
chirp_signal = np.sin(250 * np.pi * x ** 2)
fig, ax = plt.subplots(figsize=(8, 2))
ax.set_title("Original Chirp Signal")
ax.plot(chirp_signal)
plt.show()
data = chirp_signal
waveletname = 'haar'
fig, axarr = plt.subplots(nrows=5, ncols=2, figsize=(8, 6))
for ii in range(5):
(data, coeff_d) = pywt.dwt(data, waveletname)
axarr[ii, 0].plot(data, 'r')
axarr[ii, 1].plot(coeff_d, 'g')
axarr[ii, 0].set_ylabel("Level {}".format(ii + 1), fontsize=14, rotation=90)
axarr[ii, 0].set_yticklabels([])
if ii == 0:
axarr[ii, 0].set_title("Approximation coefficients", fontsize=14)
axarr[ii, 1].set_title("Detail coefficients", fontsize=14)
axarr[ii, 1].set_yticklabels([])
plt.tight_layout()
plt.show()
例程 17_5:圖像的 Haar 小波分解
對(duì)二維圖像進(jìn)行 Haar 小波變換的例程和結(jié)果如下。
import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt
from pywt._doc_utils import wavedec2_keys, draw_2d_wp_basis
if __name__ == '__main__':
# (5) 圖像的 Haar 小波分解
x = pywt.data.camera().astype(np.float32)
shape = x.shape
max_lev = 3 # 要繪制多少級(jí)分解
label_levels = 3 # 圖上要顯式標(biāo)注多少層
fig, axes = plt.subplots(2, 4, figsize=[14, 8])
for level in range(0, max_lev + 1):
if level == 0:
# 顯示原始圖像
axes[0, 0].set_axis_off()
axes[1, 0].imshow(x, cmap=plt.cm.gray)
axes[1, 0].set_title('Image')
axes[1, 0].set_axis_off()
continue
# 繪制標(biāo)準(zhǔn)DWT基的子帶邊界
draw_2d_wp_basis(shape, wavedec2_keys(level), ax=axes[0, level], label_levels=label_levels)
axes[0, level].set_title('{} level\ndecomposition'.format(level))
# 計(jì)算二維 DWT
c = pywt.wavedec2(x, 'haar', mode='periodization', level=level)
# 獨(dú)立規(guī)范化每個(gè)系數(shù)數(shù)組以獲得更好的可見(jiàn)性
c[0] /= np.abs(c[0]).max()
for detail_level in range(level):
c[detail_level + 1] = [d / np.abs(d).max() for d in c[detail_level + 1]]
# 顯示歸一化系數(shù) (normalized coefficients)
arr, slices = pywt.coeffs_to_array(c)
axes[1, level].imshow(arr, cmap=plt.cm.gray)
axes[1, level].set_title('Coefficients\n({} level)'.format(level))
axes[1, level].set_axis_off()
plt.tight_layout()
plt.show()
2.2 小波變換在圖像處理中的應(yīng)用
小波變換在圖像處理中的應(yīng)用與傅里葉變換類似,基本方法是:
(1)計(jì)算一幅圖像的二維小波變換,并得到小波系數(shù)
(2)對(duì)小波系數(shù)進(jìn)行修改,保留有效成分,過(guò)濾不必要成分
(3)使用修改后的小波系數(shù)進(jìn)行圖像重建
基于小波變換的圖像去噪步驟:
(1)圖像小波變換。選擇一個(gè)小波,計(jì)算噪聲圖像的小波系數(shù)。
(2)對(duì)細(xì)節(jié)系數(shù)通過(guò)閾值進(jìn)行過(guò)濾。選擇一個(gè)細(xì)節(jié)系數(shù)閾值,并對(duì)所有細(xì)節(jié)系數(shù)進(jìn)行閾值化操作。
(3)基于閾值化過(guò)濾后的細(xì)節(jié)系數(shù)及原始近似系數(shù),使用小波變換對(duì)圖像進(jìn)行重建。
版權(quán)聲明:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-453977.html
youcans@xupt 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:(https://blog.csdn.net/youcans/article/details/130320033)
Copyright 2022 youcans, XUPT
歡迎關(guān)注 『youcans 的 OpenCV 學(xué)習(xí)課』 系列,持續(xù)更新文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-453977.html
到了這里,關(guān)于【youcans 的圖像處理學(xué)習(xí)課】21. Haar 小波變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!