溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Python中使用dHash算法

發(fā)布時(shí)間:2021-04-22 15:25:49 來(lái)源:億速云 閱讀:175 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)怎么在Python中使用dHash算法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

python主要應(yīng)用領(lǐng)域有哪些

1、云計(jì)算,典型應(yīng)用OpenStack。2、WEB前端開發(fā),眾多大型網(wǎng)站均為Python開發(fā)。3.人工智能應(yīng)用,基于大數(shù)據(jù)分析和深度學(xué)習(xí)而發(fā)展出來(lái)的人工智能本質(zhì)上已經(jīng)無(wú)法離開python。4、系統(tǒng)運(yùn)維工程項(xiàng)目,自動(dòng)化運(yùn)維的標(biāo)配就是python+Django/flask。5、金融理財(cái)分析,量化交易,金融分析。6、大數(shù)據(jù)分析。

1、說(shuō)明

縮小圖片:縮小到9*8,這樣它就有72個(gè)像素點(diǎn)。

轉(zhuǎn)換成灰度圖。

計(jì)算差異值:dHash算法在相鄰像素之間工作,因此每行9個(gè)像素之間產(chǎn)生8個(gè)不同的差異,總共8行,產(chǎn)生64個(gè)差異值。

獲取指紋:如果左像素比右像素亮,記錄為1,否則為0。

最后對(duì)比兩張圖片的指紋,獲得漢明距離。

2、實(shí)例

# -*- coding: utf-8 -*-
# 利用python實(shí)現(xiàn)多種方法來(lái)實(shí)現(xiàn)圖像識(shí)別
 
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 最簡(jiǎn)單的以灰度直方圖作為相似比較的實(shí)現(xiàn)
def classify_gray_hist(image1,image2,size = (256,256)):
 # 先計(jì)算直方圖
 # 幾個(gè)參數(shù)必須用方括號(hào)括起來(lái)
 # 這里直接用灰度圖計(jì)算直方圖,所以是使用第一個(gè)通道,
 # 也可以進(jìn)行通道分離后,得到多個(gè)通道的直方圖
 # bins 取為16
 image1 = cv2.resize(image1,size)
 image2 = cv2.resize(image2,size)
 hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0])
 hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0])
 # 可以比較下直方圖
 plt.plot(range(256),hist1,'r')
 plt.plot(range(256),hist2,'b')
 plt.show()
 # 計(jì)算直方圖的重合度
 degree = 0
 for i in range(len(hist1)):
 if hist1[i] != hist2[i]:
 degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
 else:
 degree = degree + 1
 degree = degree/len(hist1)
 return degree
 
# 計(jì)算單通道的直方圖的相似值
def calculate(image1,image2):
 hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0])
 hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0])
 # 計(jì)算直方圖的重合度
 degree = 0
 for i in range(len(hist1)):
 if hist1[i] != hist2[i]:
 degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
 else:
 degree = degree + 1
 degree = degree/len(hist1)
 return degree
 
# 通過(guò)得到每個(gè)通道的直方圖來(lái)計(jì)算相似度
def classify_hist_with_split(image1,image2,size = (256,256)):
 # 將圖像resize后,分離為三個(gè)通道,再計(jì)算每個(gè)通道的相似值
 image1 = cv2.resize(image1,size)
 image2 = cv2.resize(image2,size)
 sub_image1 = cv2.split(image1)
 sub_image2 = cv2.split(image2)
 sub_data = 0
 for im1,im2 in zip(sub_image1,sub_image2):
 sub_data += calculate(im1,im2)
 sub_data = sub_data/3
 return sub_data
 
# 平均哈希算法計(jì)算
def classify_aHash(image1,image2):
 image1 = cv2.resize(image1,(8,8))
 image2 = cv2.resize(image2,(8,8))
 gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
 gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
 hash2 = getHash(gray1)
 hash3 = getHash(gray2)
 return Hamming_distance(hash2,hash3)
 
def classify_pHash(image1,image2):
 image1 = cv2.resize(image1,(32,32))
 image2 = cv2.resize(image2,(32,32))
 gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
 gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
 # 將灰度圖轉(zhuǎn)為浮點(diǎn)型,再進(jìn)行dct變換
 dct1 = cv2.dct(np.float32(gray1))
 dct2 = cv2.dct(np.float32(gray2))
 # 取左上角的8*8,這些代表圖片的最低頻率
 # 這個(gè)操作等價(jià)于c++中利用opencv實(shí)現(xiàn)的掩碼操作
 # 在python中進(jìn)行掩碼操作,可以直接這樣取出圖像矩陣的某一部分
 dct1_roi = dct1[0:8,0:8]
 dct2_roi = dct2[0:8,0:8]
 hash2 = getHash(dct1_roi)
 hash3 = getHash(dct2_roi)
 return Hamming_distance(hash2,hash3)
 
# 輸入灰度圖,返回hash
def getHash(image):
 avreage = np.mean(image)
 hash = []
 for i in range(image.shape[0]):
 for j in range(image.shape[1]):
 if image[i,j] > avreage:
 hash.append(1)
 else:
 hash.append(0)
 return hash
 
 
# 計(jì)算漢明距離
def Hamming_distance(hash2,hash3):
 num = 0
 for index in range(len(hash2)):
 if hash2[index] != hash3[index]:
 num += 1
 return num
 
 
if __name__ == '__main__':
 img1 = cv2.imread('10.jpg')
 cv2.imshow('img1',img1)
 img2 = cv2.imread('11.jpg')
 cv2.imshow('img2',img2)
 degree = classify_gray_hist(img1,img2)
 #degree = classify_hist_with_split(img1,img2)
 #degree = classify_aHash(img1,img2)
 #degree = classify_pHash(img1,img2)
 print degree
 cv2.waitKey(0)

關(guān)于怎么在Python中使用dHash算法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI