溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python dHash算法怎么使用

發(fā)布時間:2022-05-12 11:14:54 來源:億速云 閱讀:214 作者:iii 欄目:編程語言

這篇文章主要介紹“Python dHash算法怎么使用”,在日常操作中,相信很多人在Python dHash算法怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python dHash算法怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

說明

1、縮小圖片:縮小到9*8,這樣它就有72個像素點。

2、轉換成灰度圖。

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

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

5、最后對比兩張圖片的指紋,獲得漢明距離。

實例

# -*- coding: utf-8 -*-
# 利用python實現(xiàn)多種方法來實現(xiàn)圖像識別
 
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 最簡單的以灰度直方圖作為相似比較的實現(xiàn)
def classify_gray_hist(image1,image2,size = (256,256)):
 # 先計算直方圖
 # 幾個參數(shù)必須用方括號括起來
 # 這里直接用灰度圖計算直方圖,所以是使用第一個通道,
 # 也可以進行通道分離后,得到多個通道的直方圖
 # 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()
 # 計算直方圖的重合度
 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
 
# 計算單通道的直方圖的相似值
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])
 # 計算直方圖的重合度
 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
 
# 通過得到每個通道的直方圖來計算相似度
def classify_hist_with_split(image1,image2,size = (256,256)):
 # 將圖像resize后,分離為三個通道,再計算每個通道的相似值
 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
 
# 平均哈希算法計算
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)
 # 將灰度圖轉為浮點型,再進行dct變換
 dct1 = cv2.dct(np.float32(gray1))
 dct2 = cv2.dct(np.float32(gray2))
 # 取左上角的8*8,這些代表圖片的最低頻率
 # 這個操作等價于c++中利用opencv實現(xiàn)的掩碼操作
 # 在python中進行掩碼操作,可以直接這樣取出圖像矩陣的某一部分
 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
 
 
# 計算漢明距離
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)

到此,關于“Python dHash算法怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI