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