深入探討Haar小波變換

Haar小波變換是小波變換中最簡單的一種,也是最早被廣泛使用的一種小波變換方法。它能夠將任何信號分解成數個均勻的子信號,將高頻和低頻分開,被廣泛應用於圖像和信號處理、壓縮等領域。

一、小波變換基本概念

小波變換有點類似於傅里葉變換,但又與之有所不同。前者可以將信號分解成一組基函數,而這些基函數只在有限區間內存在,因此它可以更好地處理時變信號。而後者則將信號分解成一組不同頻率的正弦和餘弦函數,因此適用於處理穩定的信號。

小波變換可以用於信號的時頻分析,同時也可用於信號的壓縮和去噪。小波分解後的低頻信號表示信號的大致趨勢,高頻信號則表示細節信息。在實際應用中,選擇合適的小波基函數非常重要。因為各種小波基函數的分解效果不同,其優勢各有千秋,Haar小波變換是其中之一。

二、Haar小波基函數

Haar小波變換的基本思想是將一個長度為$2^k$的序列分解成長度為$2^{k-1}$的兩個子序列,這兩個子序列可以表示成均值和差值的形式,前者稱為低頻分量,後者稱為高頻分量。

Haar小波有兩個基函數:$h(x)$和$g(x)$,分別對應於低頻分量和高頻分量。具體定義如下:

h(x) = 1, 0<=x<1/2
       -1, 1/2<=x<1
       0, 其他情況
       
g(x) = 1, 0<=x<1/2
       1, 1/2<=x<1
       0, 其他情況

在Haar小波基函數的定義中,$h(x)$表示均值函數或低頻部分,$g(x)$表示差值函數或高頻部分。我們可以通過將它們進行重複和調整,構造出一組哈爾小波基函數:

φ(x)=h(x), 0<=x<1

φ_{j,k}(x)={   2^{j/2}h(2^jx-k) , 2^{j-1}<=k<2^j
             -2^{j/2}h(2^jx-k) , 2^{j-1}<=k<2^j
             0, otherwise
          }
          
ψ_{j,k}(x)={   2^{j/2}g(2^jx-k) , 2^{j-1}<=k<2^j
             -2^{j/2}g(2^jx-k) , 2^{j-1}<=k<2^j
             0, otherwise
          }

其中,$j$表示小波變換的尺度或層數,$k$表示小波的平移因子,$x$是時間索引。$φ(x)$和$ψ(x)$分別對應於Haar小波的低頻部分和高頻部分,也叫做近似分量和細節分量。

三、Haar小波變換算法

Haar小波變換的算法包含兩個步驟:分解和重構。分解將信號分解成低頻部分和高頻部分,重構則將兩部分重組為原始信號。

(一)分解算法

假設輸入的信號為$f(x)$,其長度為$N=2^k$,這裡以4位數據為例子:$f(x)=[a_0,a_1,a_2,a_3]$。根據Haar小波變換的基本思想,我們需要將這個信號分解為長度為2的子序列,然後進行處理。

首先,將輸入信號的長度減半,得到長度為2的子序列$[a_0,a_2]$和$[a_1,a_3]$,將它們分別處理成平均值和差值,得到:

d_1 = (a_0-a_2)/\sqrt{2}
d_2 = (a_1-a_3)/\sqrt{2}
a_1 = (a_0+a_2)/\sqrt{2}
a_2 = (a_1+a_3)/\sqrt{2}

其中,$d_1$和$d_2$表示高頻分量,$a_1$和$a_2$表示低頻分量。最終,我們將處理好的高頻分量和低頻分量合併起來,得到長度為4的信號$[a_1,d_1,a_2,d_2]$。

對於長度為$2^k$的序列,我們可以通過遞歸地多次進行上述操作,最終得到小波變換的所有係數。下面是Haar小波變換的分解算法示例代碼:

def haarWaveletTransform(signal):
    N = len(signal)
    if N == 1:
        return signal
    else:
        signal1 = signal[0:N:2]
        signal2 = signal[1:N:2]
        mean = [(signal1[i] + signal2[i])/np.sqrt(2) for i in range(N//2)]
        diff = [(signal1[i] - signal2[i])/np.sqrt(2) for i in range(N//2)]
        cA = haarWaveletTransform(mean)
        cD = haarWaveletTransform(diff)
        return np.concatenate((cA, cD))

(二)重構算法

通過Haar小波變換,我們可以將信號分解成多個低頻分量和高頻分量。接下來,我們需要將這些分量合併起來,重構成原始信號。

假設我們已知原始信號的細節分量和近似分量,那麼可以通過一系列的加減操作來反向計算原始信號:

N = len(coef)
a = [0]*N
for i in range(N//2):
    a[2*i] = (coef[i]+coef[N//2+i])/np.sqrt(2)
    a[2*i+1] = (coef[i]-coef[N//2+i])/np.sqrt(2)

上述代碼中,$coef$數組保存着小波變換的係數,其中前一半表示近似分量,後一半表示細節分量。通過迭代地進行平均和差分運算,我們可以逐步還原出原始的信號。最終,變換後的信號並原信號是相同的。

四、應用實例

Haar小波變換在圖像處理、信號壓縮等領域有着廣泛的應用。下面我們以圖像壓縮為例,介紹Haar小波變換的具體應用。

(一)圖像壓縮

圖像壓縮是指將原始圖像壓縮成更小的尺寸,以便於存儲和傳輸。Haar小波變換可以將圖像分解成多個小波係數,然後根據數據的特徵選取部分高頻小波係數並捨棄部分低頻小波係數,從而實現圖像壓縮。

具體來說,我們可以將原始圖像分解成多個小波係數,在這些係數中選擇部分高頻係數並將其捨棄。捨棄後再通過逆變換來重建圖像。

下面是Haar小波變換在圖像壓縮方面的實現:

import cv2

def haarWaveletTransform2D(image):
    rows, cols = image.shape
    temp = np.zeros((rows,cols), dtype=float)
    for i in range(rows):
        temp[i,:] = haarWaveletTransform(image[i,:])
    for j in range(cols):
        temp[:,j] = haarWaveletTransform(temp[:,j])
    return temp

def haarWaveletTransform2DInv(coef):
    rows, cols = coef.shape
    temp = np.zeros((rows,cols), dtype=float)
    for j in range(cols):
        temp[:,j] = haarWaveletTransformInv(coef[:,j])
    for i in range(rows):
        temp[i,:] = haarWaveletTransformInv(temp[i,:])
    return temp

def compressImage(image, alpha=0.5):
    coef = haarWaveletTransform2D(image)
    threshold = np.percentile(abs(coef), alpha*100)
    coef_abs = abs(coef) # 只保留係數的絕對值
    coef[coef_abs < threshold] = 0 # 軟閾值
    image_inv = haarWaveletTransform2DInv(coef)
    return image_inv

上述代碼中,我們實現了二維Haar小波變換和相應的逆變換,然後使用軟閾值法對小波係數進行篩選,保留一部分高頻係數。

(二)示例

下面我們給出一個圖像壓縮的示例:

這是一張尺寸為512×512的彩色圖像,我們可以將其轉化為灰度圖像,然後進行壓縮。以下是Python代碼:

import cv2

# 加載圖像
img = cv2.imread("lena.png")
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# 壓縮
alpha = 0.5
compressed = compressImage(gray, alpha)

# 顯示原始圖像和壓縮後的圖像
cv2.imshow("Original Image", gray)
cv2.imshow("Compressed Image", compressed.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,$alpha$參數表示保留係數的比例,這裡我們選擇了50%。運行代碼後,可以得到以下結果:

可以看到,壓縮後的圖像失去了一些細節信息,但基本上保留了原始圖像的特徵,體積縮小了約4倍。

五、小結

Haar小波變換是最基礎的小波變換之一,它通過將信號分解成低頻分量和高頻分量,將信號在時域和頻域上分解開,具有良好的時頻定位特性。Haar小波變換具有計算簡單、可逆性強等優點,被廣泛應用於圖像和信號處理、壓縮等領域。

本文介紹了Haar小波變換的基本概念、Haar小波基函數、Haar小波變換算法以及其應用實例。通過使用Haar小波變換和軟閾值法,我們可以將圖像壓縮到較小的尺寸,同時基本保留了圖像的特徵信息。

原創文章,作者:YVII,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/132269.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YVII的頭像YVII
上一篇 2024-10-03 23:50
下一篇 2024-10-03 23:51

相關推薦

  • Python小波分解入門指南

    本文將介紹Python小波分解的概念、基本原理和實現方法,幫助初學者掌握相關技能。 一、小波變換概述 小波分解是一種廣泛應用於數字信號處理和圖像處理的方法,可以將信號分解成多個具有…

    編程 2025-04-29
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25

發表回復

登錄後才能評論