感知雜湊算法4 Difference Hashing
之前的 aHash 是算出每個特徵像素與平均值的高低來做為雜湊值,這次我們用另一種方式計算圖像的感知雜湊。透過比較特徵像素是否高於前一個特徵像素來算出雜湊值。aHash 的做法可以說是我們注重的是平均值(或是後來我們改為中位數),而這次的 dHash 我們注重的是特徵像素的梯度。
一、減少顏色
將圖像轉換為灰階。在這裡表示圖像亮度。這裡也可以說是我們注重亮度的梯度。
二、減少尺寸
我們在這個步驟將圖片縮小為 8×9 。 column 為9 的原因是我們要讓產生的雜湊值是 8×8 而不是 8×7 。
三、計算差異
在程式範例裡面,計算的是相鄰的兩個特徵像素中,左邊是否比右邊亮(左邊值大於右邊)。順序為由左至右,由上至下。
四、組合成雜湊值
python 程式如下
def dhash(img): hash_size = 8 image = transform.resize(img, (hash_size, hash_size+1)) diff = image[:, 1:] > image[:, :-1] return diff.flatten().astype(np.uint8)
使用跟之前一樣的圖片集做比對,結果如下:
dHash h1 h2 h3 h4 h5 h6 h7
h1 64 56 41 58 62 60 61
h2 56 64 45 58 56 54 59
h3 41 45 64 41 41 43 44
h4 58 58 41 64 58 56 59
h5 62 56 41 58 64 60 61
h6 60 54 43 56 60 64 59
h7 61 59 44 59 61 59 64
總結
在我們之前的文章裡面介紹了三種感知雜湊算法,aHash 計算每個像素與平均值的高低,pHash 使用離散餘轉換,將圖像轉換為頻率域上的系數,然後計算每個系數與中位數的高低,wHash 則是使用小波轉換然後計算系數與中位數的高低。
在之前的文章內我認為總數值應該盡可能的高才符合期待,這裡可能有兩個錯誤,是我看了一篇論文 Perceptual hashing for image authentication: A survey 之後發現的。我打算用另一篇文章來做為總結討論。第一個錯誤,不同的感知雜湊方式對於不同的圖像操作,有不同的防禦(檢測)能力。第二個錯誤,每種圖像操作有更具代表性的做法,而我使用的圖片集裡面的操作不具備代表性。因此,未來我將另尋更具代表性的公開圖片集來做測試。