亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

詳解相似圖片匹配算法:差異值哈希算法 + 顏色直方圖

eternalshallow / 3706人閱讀

摘要:由于最近涉及到匹配相似圖片的問(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 ,兩張圖片的相似度就很高了。

差異值哈希算法的 Python 代碼
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 * 88,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

顏色直方圖的 Python 代碼
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

相關(guān)文章

  • 利用python進(jìn)行識(shí)別相似圖片(一)

    摘要:圖像指紋與漢明距離在介紹下面其他判別相似度的方法前,先補(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è)...

    HitenDev 評(píng)論0 收藏0
  • 文字檢測(cè)識(shí)別系統(tǒng)好用嗎?都針對(duì)什么進(jìn)行識(shí)別?

    摘要:神經(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.字符...

    wanglu1209 評(píng)論0 收藏0
  • 如何識(shí)別圖片驗(yàn)證碼?

    摘要:圖片驗(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),...

    y1chuan 評(píng)論0 收藏0
  • 從零開始的無(wú)人駕駛 1

    摘要:霍夫變化是圖像變化中的經(jīng)典算法,主要用來(lái)尋找圖像中符合某種特征的集合,說(shuō)白了就是檢測(cè)直線圓橢圓。定向梯度直方圖相比于之前的特征,特征更加健壯,并且無(wú)視顏色的影響。行為克隆算是的一種。 Lanes Finding with Computer Vision 利用計(jì)算機(jī)視覺(jué)進(jìn)行道路檢測(cè),一般包括6部分:攝像頭校正(camera calibration)、圖像失真校正(distortion c...

    marek 評(píng)論0 收藏0
  • 爬蟲敏感圖片的識(shí)別與過(guò)濾,了解一下?

    摘要:爬蟲敏感圖片的識(shí)別與過(guò)濾,了解一下需求我們需要識(shí)別出敏感作者的頭像把皮卡丘換成優(yōu)雅的。對(duì)比哈希不同圖片對(duì)比的方法,就是對(duì)比它們的位哈希中,有多少位不一樣漢明距離。 爬蟲敏感圖片的識(shí)別與過(guò)濾,了解一下? 需求 我們需要識(shí)別出敏感作者的avatar頭像,把皮卡丘換成優(yōu)雅的python。 敏感圖片樣本屬性: showImg(https://ws3.sinaimg.cn/large/006tN...

    linkin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<