使用Python,OpenCV进行图像哈希
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV进行图像哈希
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV進行圖像哈希
- 1. 效果圖
- 2. 原理
- 3. 源代碼
- 參考
這篇博客將介紹圖像哈希,感知哈希以及這些算法如何用于(快速)確定圖像的視覺內容是否相同或相似。并實現了差異散列,一個常見的感知散列算法(1)非常快,而(2)非常準確。以此來判斷圖片是否發生變化。
1. 效果圖
2. 原理
圖像哈希或者感知哈希的步驟是: 基于圖像的內容,構建唯一標識輸入圖像的散列值。
通過利用圖像散列算法,可以在恒定的時間內或最差,O(Log n)時間找到近似相同的圖像。
-
為什么傳統哈希不起作用
傳統的md5、sha等密碼散列算法的本質:更改文件中的單個位會導致不同的哈希。 實質上圖像哈希希望只有單個像素變化的,認為圖像沒有變化,或者圖像縮放也認為沒有變化;
-
差異哈希(DHASH)的好處:
1)輸入圖像的寬高比更改(由于忽略了縱橫比),圖像哈希不會改變;
2)調整亮度或對比度(1)不會改變哈希值或(2)只會稍微改變它,確保散列將靠近;
3)差異散列非常快且準確; -
通常使用 漢明距離 來比較哈希值。兩個漢明距離很小的哈希意味著兩個散列是相同的,并且兩個圖像也是相同的/感知相似的。
3. 源代碼
# USAGE
# python hash.py --images images# 導入必要的包
from imutils import paths
import argparse
import time
import sys
import cv2# 設置圖像散列為8,表示構建8*8=64位哈希值
def dhash(image, hashSize=8):# 縮放輸入圖像,增加一列以計算水平梯度差值resized = cv2.resize(image, (hashSize + 1, hashSize))# 計算相鄰水平梯度列像素差值diff = resized[:, 1:] > resized[:, :-1]# 轉換圖像差異為hashreturn sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v])# 構建命令行參數及解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True,help="dataset of images to search through (i.e., the haytack)")
args = vars(ap.parse_args())# 獲取hastach、needle文件圖片
print("[INFO] computing hashes for images...")
hashmapsPaths = list(paths.list_images(args["images"]))# 移除文件名中的\
if sys.platform != "win32":hashmapsPaths = [p.replace("\\", "") for p in hashmapsPaths]# 初始化存放圖像名及其hash值的map,并計時
hashmaps = {}
start = time.time()# 遍歷hashmaps路徑
for p in hashmapsPaths:# 從磁盤加載圖像image = cv2.imread(p)# 如果圖像為None,則跳過if image is None:continue# 轉換圖像為灰度圖,并計算圖像hash值image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)imageHash = dhash(image)# 更新hashmaps字典l = hashmaps.get(imageHash, [])l.append(p)hashmaps[imageHash] = l# 展示hash耗時及hashmaps照片數,開始計算needles文件夾的圖像hash值
print("[INFO] processed {} images in {:.2f} seconds".format(len(hashmaps), time.time() - start))
print("[INFO] computing hashes for needles...")for k,v in hashmaps.items():print("[INFO] {}: {}".format(k,v))
參考
- https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV进行图像哈希的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OpenCV和Imutils构建图像
- 下一篇: GLTF教程翻译