感知雜湊算法1 Average Hashing

圖像相關 andy 3年前 (2021-05-17) 1134次浏览 已收录 0个评论 扫描二维码

感知雜湊算法

什麼是感知雜湊算法

感知雜湊算法 (perceptual hash algorithm ),主要是用來產生圖像結構的雜湊值,讓有相似結構的圖片產生相同或相似的雜湊值。而且感知雜湊算法的雜湊值 hash 跟一般雜湊運算有些許不同,可以使用感知雜湊值來比對圖像是否相似。

一般的雜湊運算如 MD5 、SHA ,不同的數據會產生不同的雜湊值,哪怕數據只有一個位元不同,也會產生完全不同的雜湊值,一般稱這個特徵為「雪崩效應」(Avalanche effect )。而感知雜湊算法的雜湊值是可以透過比較雜湊值的漢明距離 (Hamming Distance )來算出圖像的相似度。

average hashing algorithm
均值雜湊算法

1、縮小
要保留圖片結構最快的方式就是把圖片縮小,縮小可以去掉圖片的細節及變化大的高頻部份。縮小的方式只要保持一致,就不會影響比對的正確性。

2、減少顏色
把縮小後的圖片轉為灰階。

3、計算平均值
算出64個像素的平均值

4、計算每個像素的高低值
每個像素跟平均值比較,高於平均值結果計為1,低於平均值結果計為0。此步驟會得出長度為64個位元的結果。

5、組合成雜湊值
將64個位元的結果轉換成十六進制。這也可以看成是把長度為64的二進制結果轉換為64位元的整數類型。

算出均值雜湊之後,就可以比對雜湊值,來判斷圖片是否相同。當圖片放大縮小,更改寬高比時,成生的雜湊不值將保持不變(放大縮小及更改寬高應有有條件限制)。增加減少亮度、對比度及改變顏色時,都不會顯著改變雜湊值。

實作後,以六張經過處理之後的圖片,第七張圖是第一張圖經過直方圖等化處理的結果,進行交叉比對後,將相同位元總數記錄如下表。

xx h1 h2 h3 h4 h5 h6 h7
h1 xx 57 53 57 64 62 62
h2 57 xx 50 58 57 55 55
h3 53 50 xx 50 53 53 53
h4 57 58 50 xx 57 55 55
h5 64 57 53 57 xx 62 62
h6 62 55 53 55 62 xx 64
h7 62 55 53 55 62 64 xx

結果基本符合預期,對於有旋轉或變形的圖片,雜湊值的相似度較低。經過變色、縮放等操作的雜湊值相似度較高甚至相同(64為雜湊值相同)。程式及圖片附於下方。下一篇文章將會做程式整理及說明。

import numpy as np
from skimage import io, transform, color, util

img = io.imread('asset/g04.png')
hash_size = 8

io.imshow(img)
io.show()

# 縮小
img_r = transform.resize(img, (hash_size, hash_size))
io.imshow(img_r)
io.show()

# 灰階
img_f = color.rgb2gray(img_r)
io.imshow(img_f)
io.show()

# 轉成 0-255
# pixels = np.asarray(img_f)
pixels = util.img_as_ubyte(img_f)
# pixels = np.around(255*img_f)

# 計算平均值
avg = pixels.mean()

#   與平均值的差異
diff = pixels > avg

# 轉換為 bit array
# diff.astype(np.uint8)
# diff.flatten().astype(np.uint8)

# 轉換成每一個 byte 值
np.packbits(diff)

# 輸出 hex
np.packbits(diff).astype(np.uint8).tobytes().hex()


# bin(int("abc123efff", 16))[2:]


def compare_hash(s, diff):
    a1 = diff.flatten().astype(np.uint8)
    a2 = np.array(list(s), dtype=np.uint8)

圖片b1: 原始圖

圖片b2: 變形+旋轉

圖片b3: 變形+黑邊

圖片b4: 縮小

圖片b5: 加字

圖片b6: 放大少許

圖片b7:直方圖等化

下圖為 b1,原始圖,產生 h1 hash
感知雜湊算法1 Average Hashing
下圖為 b2,變形+旋轉,產生 h2 hash
感知雜湊算法1 Average Hashing
下圖為 b3,變形+黑邊,產生 h3 hash
感知雜湊算法1 Average Hashing
下圖為 b4,縮小,產生 h4 hash
感知雜湊算法1 Average Hashing
下圖為 b5,加字,產生 h5 hash
感知雜湊算法1 Average Hashing
下圖為 b6,放大少許,產生 h6 hash
感知雜湊算法1 Average Hashing

圖7 在程式內對 b1 使用直方圖等化,故無圖。


神隊友學長Andy , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:感知雜湊算法1 Average Hashing
喜欢 (0)
[[email protected]]
分享 (0)
andy
关于作者:
中年大叔,打拼 like young students.
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址