轉載請注明出處
背景
在重復圖識別領域,對于識別肉眼相同圖片,感知哈希效果是很魯棒的,上一篇文章 【PHash】更懂人眼的感知哈希 介紹的PHash識別效果很好,但是它有一個缺點,只關注低頻資訊,并沒有關注圖片的空間資訊,極端情況就可能出現完全不同的兩張圖片,phash值很近,而WHash利用小波變換不僅重點關注低頻資訊,同時也關注圖片的空間資訊,
WHash演算法
- WHash演算法如下:

下面附上源代碼,代碼很短,也可以先忽略: - python原始碼如下:
def whash(image, hash_size = 8):
#check
assert hash_size & (hash_size-1) == 0, "hash_size is not power of 2"
image_scale = max(2**int(numpy.log2(min(image.size))), hash_size)
ll_max_level = int(numpy.log2(image_scale))
level = int(numpy.log2(hash_size))
assert level <= ll_max_level, "hash_size in a wrong range"
#預處理
image = image.convert("L").resize((image_scale, image_scale), Image.ANTIALIAS)
pixels = numpy.asarray(image) / 255.
# 小波變換,haar
coeffs = pywt.wavedec2(pixels, 'haar', level = ll_max_level)
# 去掉最低頻
coeffs[0] *= 0
# 小波逆變換
dwt_low = pywt.waverec2(coeffs[:level+1], 'haar')
#二值化,中值
med = numpy.median(dwt_low)
diff = dwt_low > med
return diff
WHash演算法其實也比較簡單,主要利用了小波變換獲取低頻資訊,主要就是下面3步:
- 圖片預處理(resize,轉灰度圖)
- 小波變換
- 二值化
其中預處理就是縮放+轉灰度圖,而二值化跟PHash一樣,都是利用中值當作基準值,
這里的重點在于小波變換,下面簡單直觀的給大家看下小波變換究竟是什么?
直觀理解小波變換
在圖片上進行小波變換,可以把圖片的低頻跟高頻資訊拆分,如下所示:

其中,A是低頻資訊,H是水平高頻資訊,V是垂直高頻資訊、D是對角高頻資訊,
在實際運用,并不是只進行一次低頻高頻拆分,會進行多次,如下圖所示:

在WHash這里,我們只是拿最右邊那張圖片,左上角1/4資訊進行二值化,其他資訊都是拋棄的,
在WHash里面,小波變換并不是單純的拿到了圖片的低頻資訊,而且還保存了本身圖片的空間資訊,所以它實際使用程序中,比PHash魯棒一些,當然如果PHash對只對低頻部分進行DCT逆變換,然后再進行二值化,也是可以考慮上空間資訊的,跟WHash一樣的道理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233822.html
標籤:其他
上一篇:nginx配置解決路由報錯問題
