摘要:由于最近涉及到匹配相似圖片的問題,所以在此記錄下解決辦法差異值哈希算法顏色直方圖環境要求庫庫差異值哈希算法檢索相似圖片,第一個想到的就是差異值哈希算法。
由于最近涉及到匹配相似圖片的問題,所以在此記錄下解決辦法:差異值哈希算法 + 顏色直方圖
環境要求:Python cv2庫 math庫
差異值哈希算法檢索相似圖片,第一個想到的就是差異值哈希算法。這個算法的步驟是:
縮小尺寸
一般將圖片縮放為 8 * 8 的尺寸大小,共64個像素的圖片。但是由于64個像素對于我來說,損失的細節太多所以我選擇了縮放到 33 * 32 的尺寸大小
彩色圖像灰度化
由于我們現有的圖片是由 RGB 三原色構成,每個像素點是一個由這三個顏色組成的一個 list 。而 RGB 三個顏色中每個顏色值都是用 8 個比特來表示,大小范圍是 0 ~ 255(2^8 - 1),就一共有 256 * 256 * 256 種顏色。并且作為一個像素類似于這樣的數值:[253 255 255] 是不利于簡單比較的,肉眼看著類似的顏色,但是它的三個顏色分布可能相差很多。所以將它灰度化,用 256 個不同的灰色表示現有的圖片。由于現在用一種灰色表示三種顏色,原來每個像素是一個 list 現在就降維成一個數值,數值的大小還是比較容易比較的。
比較像素的灰度值
比較圖片灰度化的每行相鄰像素之間的大小,每行后面像素值大于前面一個像素值那么記為1,如果不大于則記為0
計算哈希值
根據上一步得到了由0和1構成的數組合在一起就構成了1024位的整數
對比不同圖片的漢明距離
對比兩個圖片生成的整數有多少位不一樣。一般漢明距離小于 5 ,兩張圖片的相似度就很高了。
import cv2 # 差異值哈希算法 def dhash(image): resize_height, resized_width = 32, 33 # 縮放到(resized_width, resize_height)尺寸的大小 resized_img = cv2.resize(image, (resized_width, resize_height)) # 圖片灰度化 grey_resized_img = cv2.cvtColor(resized_img, cv2.COLOR_RGB2GRAY) # 差異值計算 hash_list = [] for row in range(resize_height): for col in range(resized_width - 1): # 每行前一個顏色強度大于后一個,值為1,否則值為0 if grey_resized_img[row, col] > grey_resized_img[row, col + 1]: hash_list.append("1") else: hash_list.append("0") return "" . join(hash_list) # 比較漢明距離 def hamming_distance(dhash1, dhash2): return bin(int(dhash1, base = 2) ^ int(dhash2, base = 2)).count("1") # 讀取圖片內容 img1 = cv2.imread(img1_path) # 讀取圖片內容 img2 = cv2.imread(img2_path) if hamming_distance(dhash(img1), dhash(img2)) <= 5: print("相似圖片")顏色直方圖
由于差異值哈希失去了太多的細節,適合比較原圖或者縮略圖。所以我再加上顏色直方圖的比較計算圖片間的接近程度,用以排除部分像素的微小差異。
縮小尺寸
一般將圖片縮放為 8 * 8 的尺寸大小,共64個像素的圖片。但是由于64個像素對于我來說,損失的細節太多所以我選擇了縮放到 32 * 32 的尺寸大小
降低位深
原來 RGB 每個顏色都有 256 種變化,現在做一個映射,將原來的 256 分為 8(3個比特表示) 個顏色區間。類似舊的 0 - 31 對應新的顏色 0,以達到降低計算的效果
計算像素值
由于降低了位深,圖片顏色值變小。每個顏色值不大于8(0 - 7),然后我們給三元素不同的權重,分別為 8 * 8,8,1 作為數組的 key,用以統計每個顏色的像素出現次數,并且不會出現不同顏色統計到了同一個 key 值下的目的。
計算相似度
計算出像素值后得到,我們得到了以不同顏色的數值為 key,出現次數為 value 的數組。這時候我們可以使用用余弦相似度去計算相同顏色出現次數的相似度,越是相似的像素最后值越接近于1。截圖來自于WiKi
import cv2 from math import sqrt # 顏色映射 def bgr_mapping(img_val): # 將bgr顏色分成8個區間做映射 if img_val >= 0 and img_val <= 31: return 0 if img_val >= 32 and img_val <= 63: return 1 if img_val >= 64 and img_val <= 95: return 2 if img_val >= 96 and img_val <= 127: return 3 if img_val >= 128 and img_val <= 159: return 4 if img_val >= 160 and img_val <= 191: return 5 if img_val >= 192 and img_val <= 223: return 6 if img_val >= 224: return 7 # 顏色直方圖的數值計算 def calc_bgr_hist(image): if not image.size: return False hist = {} # 縮放尺寸減小計算量 image = cv2.resize(image, (32, 32)) for bgr_list in image: for bgr in bgr_list: # 顏色按照順序映射 maped_b = bgr_mapping(bgr[0]) maped_g = bgr_mapping(bgr[1]) maped_r = bgr_mapping(bgr[2]) # 計算像素值 index = maped_b * 8 * 8 + maped_g * 8 + maped_r hist[index] = hist.get(index, 0) + 1 return hist # 計算兩張圖片的相似度 def compare_similar_hist(h1, h2): if not h1 or not h2: return False sum1, sum2, sum_mixd = 0, 0, 0 # 像素值key的最大數不超過512,直接循環到512,遍歷取出每個像素值 for i in range(512): # 計算出現相同像素值次數的平方和 sum1 = sum1 + (h1.get(i, 0) * h1.get(i, 0)) sum2 = sum2 + (h2.get(i, 0) * h2.get(i, 0)) # 計算兩個圖片次數乘積的和 sum_mixd = sum_mixd + (h1.get(i, 0) * h2.get(i, 0)) # 按照余弦相似性定理計算相似度 return sum_mixd / (sqrt(sum1) * sqrt(sum2)) # 讀取圖片內容 img1 = cv2.imread(img1_path) # 讀取圖片內容 img2 = cv2.imread(img2_path) if compare_similar_hist(calc_bgr_hist(img1), calc_bgr_hist(img2)) < 0.9999: print("相似圖片")總結
總的來說:差異值哈希算法 + 顏色直方圖 解決了我的相似圖片匹配問題。
參考資料相似圖片搜索的原理一
相似圖片搜索的原理二
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43565.html
摘要:圖像指紋與漢明距離在介紹下面其他判別相似度的方法前,先補充一些概念。漢明距離為,即代表兩張圖片完全一樣。下一次將講述利用和以訓練好的模型來進行人臉識別。本文參考文章和圖片來源的文章賴勇浩的文章下一篇地址利用進行識別相似圖片二 文章簡介 在網上看到python做圖像識別的相關文章后,真心感覺python的功能實在太強大,因此將這些文章總結一下,建立一下自己的知識體系。當然了,圖像識別這個...
摘要:神經網絡以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準確程度。目前驗證碼識別最先進的是谷歌在識別街景圖像中門牌號碼中使用的一套的算法。 最近在一個爬蟲項目中遇到了驗證碼,需要機器自動識別繞過。剛好與題主的問題類似,在這里做一些分享。 在網上調研了資料和文獻后,分別采用OCR識別和模板庫匹配方法對不同類型驗證碼進行了識別。主要過程可以分解為三個步驟:1.圖片清理,2.字符...
摘要:圖片驗證碼是目前最常用的一種。神經網絡以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準確程度。目前驗證碼識別最先進的是谷歌在識別街景圖像中門牌號碼中使用的一套的算法。 全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),...
摘要:霍夫變化是圖像變化中的經典算法,主要用來尋找圖像中符合某種特征的集合,說白了就是檢測直線圓橢圓。定向梯度直方圖相比于之前的特征,特征更加健壯,并且無視顏色的影響。行為克隆算是的一種。 Lanes Finding with Computer Vision 利用計算機視覺進行道路檢測,一般包括6部分:攝像頭校正(camera calibration)、圖像失真校正(distortion c...
摘要:爬蟲敏感圖片的識別與過濾,了解一下需求我們需要識別出敏感作者的頭像把皮卡丘換成優雅的。對比哈希不同圖片對比的方法,就是對比它們的位哈希中,有多少位不一樣漢明距離。 爬蟲敏感圖片的識別與過濾,了解一下? 需求 我們需要識別出敏感作者的avatar頭像,把皮卡丘換成優雅的python。 敏感圖片樣本屬性: showImg(https://ws3.sinaimg.cn/large/006tN...
閱讀 1438·2021-09-28 09:44
閱讀 2501·2021-09-28 09:36
閱讀 1144·2021-09-08 09:35
閱讀 1982·2019-08-29 13:50
閱讀 810·2019-08-29 13:29
閱讀 1130·2019-08-29 13:15
閱讀 1724·2019-08-29 13:00
閱讀 2988·2019-08-26 16:16