感知雜湊算法3 Wavelet Hashing
本次我們使用小波轉換 ( Wavelet Transform) 來計算感知雜湊。在圖像壓縮及圖像品質方面使用小波轉換的結果普遍要高於離散餘弦轉換,而在感知雜湊方面,則取決於在頻率域保留圖像特徵的能力。因此多種不同的小波轉換因為有不同的母波,對其轉換的波形也會有不同的結果。我們先以 Haar 小波轉換做感知雜湊測試,並且維持跟 ahash 及 phash 相同的步驟進行運算。
一、減少顏色
將圖像轉換為灰階。在改變大小前減少顏色的主要目的是增加效能。
二、減少尺寸
圖像尺寸並不影響最後的雜湊結果,因為只保留最後三階的結果。這個步驟也可以直接將圖片縮小為 8×8 。
三、計算DWT
我們使用 Haar 小波轉換,轉換後保留最後三階結果。
四、取中位數並計算
取結果的中位數,並進行與中位的比較,高的為1低的為0。
五、組合成雜湊值
和 aHash、pHash 相同,將64個結果組合成十六進制的字串,成為雜湊值。
python 程式如下
def whash(image, hash_size=8, mode='haar'): image_natural_scale = int(np.log2(image.shape[0])) img_size = 2**image_natural_scale ll_max_level = int(np.log2(img_size)) level = int(np.log2(hash_size)) dwt_level = ll_max_level - level image = transform.resize(image, (img_size, img_size)) pixels = np.asarray(image) coeffs = pywt.wavedec2(pixels, mode, level=dwt_level) dwt_low = coeffs[0] med = np.median(dwt_low) diff = dwt_low > med return diff.flatten().astype(np.uint8)
在此以 haar 小波轉換做為測試,也可以改用其他小波轉換。在這段程式碼裡面,為了符合圖像轉換的比例,自動計算了應該縮放的尺寸。最後使用了跟之前一樣的8張圖片來比對,結果如下:
wavelet | h1 | h2 | h3 | h4 | h5 | h6 | h7 |
h1 | 64 | 54 | 52 | 54 | 64 | 60 | 62 |
h2 | 54 | 64 | 50 | 58 | 54 | 54 | 54 |
h3 | 52 | 50 | 64 | 46 | 52 | 50 | 50 |
h4 | 54 | 58 | 46 | 64 | 54 | 52 | 54 |
h5 | 64 | 54 | 52 | 54 | 64 | 60 | 62 |
h6 | 60 | 54 | 50 | 52 | 60 | 64 | 60 |
h7 | 62 | 54 | 50 | 54 | 62 | 60 | 64 |
結論
經由測試的結果發現數據總結果比 pHash 來得好,這個符合我們的預期,但加總還是比 aHash 差。我們下次將使用最後一個 diffirence Hash 來進行測試,我們預期 dHash 的結果應該是最好的。