中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在Python中使用dHash算法

發布時間:2021-04-22 15:25:49 來源:億速云 閱讀:181 作者:Leah 欄目:編程語言

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

python主要應用領域有哪些

1、云計算,典型應用OpenStack。2、WEB前端開發,眾多大型網站均為Python開發。3.人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開python。4、系統運維工程項目,自動化運維的標配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。

1、說明

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

轉換成灰度圖。

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

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

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

2、實例

# -*- coding: utf-8 -*-
# 利用python實現多種方法來實現圖像識別
 
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
# 最簡單的以灰度直方圖作為相似比較的實現
def classify_gray_hist(image1,image2,size = (256,256)):
 # 先計算直方圖
 # 幾個參數必須用方括號括起來
 # 這里直接用灰度圖計算直方圖,所以是使用第一個通道,
 # 也可以進行通道分離后,得到多個通道的直方圖
 # 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實現的掩碼操作
 # 在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算法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

柳林县| 托克逊县| 图们市| 蚌埠市| 上林县| 邛崃市| 什邡市| 汝南县| 同仁县| 洛宁县| 大冶市| 黄龙县| 开封市| 乌拉特中旗| 揭东县| 汽车| 漯河市| 灵台县| 绥滨县| 博罗县| 江华| 曲麻莱县| 大石桥市| 清流县| 胶南市| 安远县| 海安县| 柳河县| 游戏| 色达县| 庐江县| 巢湖市| 嘉义县| 凌云县| 文化| 河源市| 梨树县| 潼南县| 灵璧县| 黔西县| 华池县|