相似圖像搜索的哈希算法思想及實現(差值哈希算法和均值哈希算法)

圖像相似度比較哈希算法:

什么是哈希(Hash)?

? 散列函數(或散列算法,又稱哈希函數,英語:Hash Function)是一種從任何一種數據中創建小 的數字“指紋”的方法。散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定 下來。該函數將數據打亂混合,重新創建一個叫做散列值(hash values,hash codes,hash sums, 或hashes)的指紋。散列值通常用一個短的隨機字母和數字組成的字符串來代表。

? 通過哈希算法得到的任意長度的二進制值映射為較短的固定長度的二進制值,即哈希值。此外, 哈希值是一段數據唯一且極其緊湊的數值表示形式,如果通過哈希一段明文得到哈希值,哪怕只 更改該段明文中的任意一個字母,隨后得到的哈希值都將不同。

? 哈希算法是一個函數,能夠把幾乎所有的數字文件都轉換成一串由數字和字母構成的看似亂碼的 字符串。

哈希函數的特點

哈希函數作為一種加密函數,其擁有兩個最重要特點:

  1. 不可逆性。輸入信息得出輸出的那個看似亂碼的字符串(哈希值)非常容易,但是從輸出的字符 串反推出輸入的結果卻是卻非常非常難。
  2. 輸出值唯一性和不可預測性。只要輸入的信息有一點點區別,那么根據哈希算法得出來的輸出值 也相差甚遠。

哈希算法的種類

哈希算法是一類算法的總稱,共有三種:

  1. 均值哈希算法aHash
  2. 差值哈希算法dHash
  3. 感知哈希算法pHash

漢明距離

兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。
在這里插入圖片描述

均值哈希算法

步驟:

  1. 縮放:圖片縮放為8*8,保留結構,除去細節。
  2. 灰度化:轉換為灰度圖。
  3. 求平均值:計算灰度圖所有像素的平均值。
  4. 比較:像素值大于平均值記作1,相反記作0,總共64位。
  5. 生成hash:將上述步驟生成的1和0按順序組合起來既是圖片的指紋(hash)。
  6. 對比指紋:將兩幅圖的指紋對比,計算漢明距離,即兩個64位的hash值有多少位是不一樣的,不 相同位數越少,圖片越相似。

差值哈希算法

差值哈希算法相較于均值哈希算法,前期和后期基本相同,只有中間比較hash有變化。

步驟:

  1. 縮放:圖片縮放為8*9,保留結構,除去細節。
  2. 灰度化:轉換為灰度圖。
  3. 求平均值:計算灰度圖所有像素的平均值。
  4. 比較:像素值大于后一個像素值記作1,相反記作0。本行不與下一行對比,每行9個像素, 八個差值,有8行,總共64位
  5. 生成hash:將上述步驟生成的1和0按順序組合起來既是圖片的指紋(hash)。
  6. 對比指紋:將兩幅圖的指紋對比,計算漢明距離,即兩個64位的hash值有多少位是不一樣 的,不相同位數越少,圖片越相似。

感知哈希算法

均值哈希算法過于嚴格,不夠精確,更適合搜索縮略圖,為了獲得更精確的結果可以選擇感知哈希 算法,它采用的是DCT(離散余弦變換)來降低頻率的方法。

步驟:

  1. 縮小圖片:32 * 32是一個較好的大小,這樣方便DCT計算
  2. 轉化為灰度圖:把縮放后的圖片轉化為灰度圖。
  3. 計算DCT:DCT把圖片分離成分率的集合
  4. 縮小DCT:DCT計算后的矩陣是32 * 32,保留左上角的8 * 8,這些代表圖片的最低頻率。
  5. 計算平均值:計算縮小DCT后的所有像素點的平均值。
  6. 進一步減小DCT:大于平均值記錄為1,反之記錄為0.
  7. 得到信息指紋:組合64個信息位,順序隨意保持一致性。
  8. 最后比對兩張圖片的指紋,獲得漢明距離即可。

代碼實現:均值哈希算法和差值哈希算法

import cv2
import numpy as np#均值哈希算法
def aHash(img):#縮放為8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#轉換為灰度圖gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s為像素和初值為0,hash_str為hash值初值為''s=0hash_str=''#遍歷累加求像素和for i in range(8):for j in range(8):s=s+gray[i,j]#求平均灰度avg=s/64#灰度大于平均值為1相反為0生成圖片的hash值for i in range(8):for j in range(8):if  gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'            return hash_str#差值感知算法
def dHash(img):#縮放8*9img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)#轉換灰度圖gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str=''#每行前一個像素大于后一個像素為1,相反為0,生成哈希for i in range(8):for j in range(8):if   gray[i,j]>gray[i,j+1]:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_str#Hash值對比
def cmpHash(hash1,hash2):n=0#hash長度不同則返回-1代表傳參出錯if len(hash1)!=len(hash2):return -1#遍歷判斷for i in range(len(hash1)):#不相等則n計數+1,n最終為相似度if hash1[i]!=hash2[i]:n=n+1return nimg1=cv2.imread('lenna.png')
img2=cv2.imread('lenna_noise.png')
hash1= aHash(img1)
hash2= aHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print('均值哈希算法相似度:',n)hash1= dHash(img1)
hash2= dHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print('差值哈希算法相似度:',n)

運行結果:

輸入:
在這里插入圖片描述
在這里插入圖片描述
輸出:
在這里插入圖片描述

圖像相似度比較哈希算法

三種算法的比較:
? aHash:均值哈希。速度比較快,但是常常不太精確。
? pHash:感知哈希。精確度較高,但是速度方面較差一些。
? dHash:差值哈希。精確度較高,且速度也非常快。
? 均值哈希本質上是對顏色的比較;
? 感知哈希由于做了 DCT 操作,本質上是對頻率的比較;
? 差值哈希本質上是基于漸變的感知哈希算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊云AI應用產品總監王磊:AI 在傳統產業的最佳實踐

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~ 背景:5月23-24日,以“煥啟”為主題的騰訊“云未來”峰會在廣州召開,廣東省各級政府機構領導、海內外業內學術專家、行業大咖及技術大牛等在現場共議云計算與數字化產業創…

標準化(Normalization)和歸一化實現

概念: 原因: 由于進行分類器或模型的建立與訓練時,輸入的數據范圍可能比較大,同時樣本中各數據可 能量綱不一致,這樣的數據容易對模型訓練或分類器的構建結果產生影響,因此需要對其進行標準 化處理&#x…

Toast源碼深度分析

目錄介紹 1.最簡單的創建方法 1.1 Toast構造方法1.2 最簡單的創建1.3 簡單改造避免重復創建1.4 為何會出現內存泄漏1.5 吐司是系統級別的 2.源碼分析 2.1 Toast(Context context)構造方法源碼分析2.2 show()方法源碼分析2.3 mParams.token windowToken是干什么用的2.4 schedul…

序列化框架MJExtension詳解 + iOS ORM框架

當開發中你的模型中屬性名稱和 字典(JSON/XML) 中的key 不能一一對應時, 或者當字典中嵌套了多層字典數組時..., 以及教你如何用 MJExtension 配置類來統一管理你的模型配置, 下面羅列了開發中常見的一些特殊情況, 請參考!(MJExtension/github) 最基本用法: // 將字典轉為模型 …

運行keras出現 FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecated解決辦法

運行keras出現 FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, 原則來說,沒啥影響,還是能運行,但是看著難受 解決辦法: 點擊藍色的鏈接: 進入 …

RedirectToAction()轉移方式及參數傳遞

今天在做一個功能的時,使用RedirectToAction()需要從這里傳幾個參數,從網上查了一下,這樣解決。真好。 Return RedirectToAction("Index","ManageInfo",new{type0,page1});轉載于:https://www.cnblogs.com/ZaraNet/p/978…

軟件項目風險管理

近幾年來軟件開發技術、工具都有了很大的進步,但是軟件項目開發超時、超支、甚至不能滿足用戶需求而根本沒有得到實際使用的情況仍然比比皆是。軟件項目開發和管理中一直存在著種種不確定性,嚴重影響著項目的順利完成和提交。但這些軟件風險并未得到充分…

mongdb 群集_群集文檔的文本摘要

mongdb 群集This is a part 2 of the series analyzing healthcare chart notes using Natural Language Processing (NLP)這是使用自然語言處理(NLP)分析醫療保健圖表筆記的系列文章的第2部分。 In the first part, we talked about cleaning the text and extracting sectio…

keras框架實現手寫數字識別

詳細細節可學習從零開始神經網絡:keras框架實現數字圖像識別詳解! 代碼實現: [1]將訓練數據和檢測數據加載到內存中(第一次運行需要下載數據,會比較慢): (mnist是手寫數據集) train_images是用于訓練系統…

gdal進行遙感影像讀寫_如何使用遙感影像進行礦物勘探

gdal進行遙感影像讀寫Meet Jose Manuel Lattus, a geologist from Chile. In the latest Soar Cast, he discusses his work in mineral exploration and environmental studies, and explains how he makes a living by creating valuable information products based on diff…

從零開始神經網絡:keras框架實現數字圖像識別詳解!

接口實現可參考:keras框架實現手寫數字識別 思路: 我們的代碼要導出三個接口,分別完成以下功能: 初始化initialisation,設置輸入層,中間層,和輸出層的節點數。訓練train:根據訓練數據不斷的更…

大數據學習第一貼

搞了這么久的開發,一直沒有養成發博客的習慣,今天開始對大數據所需內容進行總結性記錄,并對以后遇到的問題形成一個自己的知識庫。就這些!轉載于:https://blog.51cto.com/13921538/2299765

推薦算法的先驗算法的連接_數據挖掘專注于先驗算法

推薦算法的先驗算法的連接So here we are diving into the world of data mining this time, let’s begin with a small but informative definition;因此,這一次我們將進入數據挖掘的世界,讓我們從一個小的但內容豐富的定義開始; 什么是數…

Android 頁面多狀態布局管理

一、現狀 頁面多狀態布局是開發中常見的需求,即頁面在不同狀態需要顯示不同的布局,實現的方式也比較多,最簡單粗暴的方式就是在 XML 中先將不同狀態對應的布局隱藏起來,根據需要改變其可見狀態,如果多個界面公用相同的…

Tensorflow入門神經網絡代碼框架

Tensorflow—基本用法 使用圖 (graph) 來表示計算任務.在被稱之為 會話 (Session) 的上下文 (context) 中執行圖.使用 tensor 表示數據.通過 變量 (Variable) 維護狀態.使用 feed 和 fetch 可以為任意的操作(arbitrary operation)賦值或者從其中獲取數據。 ? TensorFlow 是一…

手把手教你把代碼丟入github 中

手把手教你把代碼丟入github 中 作為一個小運維一步步教你們怎么把代碼放入到github 中 首先呢我們下載一個git的客戶端 https://git-scm.com/downloads/ 下載一個最新版的2.16.2 下載后那就安裝吧。如果看不懂英文就選擇默認安裝的方式吧。但是你得記住你的軟件安裝的位置 小…

時間序列模式識別_空氣質量傳感器數據的時間序列模式識別

時間序列模式識別 1. Introduction 2. Exploratory Data Analysis ° 2.1 Pattern Changes ° 2.2 Correlation Between Features 3. Anomaly Detection and Pattern Recognition ° 3.1 Point Anomaly Detection (System Fault) ° 3.2 Collective Anomaly Detection (Externa…

oracle 性能優化 07_診斷事件

2019獨角獸企業重金招聘Python工程師標準>>> 一、診斷事件 診斷事件無官方技術文檔支持,使用存在風險,慎用。使用診斷事件可以獲取問題更多的信息,調整系統運行 特性,啟用某些內部功能。用于系統故障的診斷。跟蹤應…

Tensorflow框架:卷積神經網絡實戰--Cifar訓練集

Cifar-10數據集包含10類共60000張32*32的彩色圖片,每類6000張圖。包括50000張訓練圖片和 10000張測試圖片 代碼分為數據處理部分和卷積網絡訓練部分: 數據處理部分: #該文件負責讀取Cifar-10數據并對其進行數據增強預處理 import os impo…

計算機科學速成課36:自然語言處理

詞性 短語結構規則 分析樹 語音識別 譜圖 快速傅里葉變換 音素 語音合成 轉載于:https://www.cnblogs.com/davidliu2018/p/9149252.html