實現 dhash dhash演算法

2021-10-16 07:16:16 字數 2877 閱讀 5573

一般拿到一批資料需要清洗資料,比如有部分資料標記錯誤,還有一些資料重複,為了提高效率,需要把這部分重複的資料給去掉,本文介紹一種在速度和準確率都相對有優勢的相似度識別演算法dhash.

演算法步驟

**實現

class dhash(object):

@staticmethod

def calculate_hash(image):

"""計算的dhash值

:param image: pil.image

:return: dhash值,string型別

"""difference = dhash.__difference(image)

# 轉化為16進製制(每個差值為乙個bit,每8bit轉為乙個16進製制)

decimal_value = 0

hash_string = ""

for index, value in enumerate(difference):

if value: # value為0, 不用計算, 程式優化

decimal_value += value * (2 ** (index % 8))

if index % 8 == 7: # 每8位的結束

hash_string += str(hex(decimal_value)[2:].rjust(2, "0")) # 不足2位以0填充。0xf=>0x0f

decimal_value = 0

return hash_string

@staticmethod

def hamming_distance(first, second):

"""計算兩張的漢明距離(基於dhash演算法)

:param first: image或者dhash值(str)

:param second: image或者dhash值(str)

:return: hamming distance. 值越大,說明兩張差別越大,反之,則說明越相似

"""# a. dhash值計算漢明距離

if isinstance(first, str):

return dhash.__hamming_distance_with_hash(first, second)

# b. image計算漢明距離

hamming_distance = 0

image1_difference = dhash.__difference(first)

image2_difference = dhash.__difference(second)

for index, img1_pix in enumerate(image1_difference):

img2_pix = image2_difference[index]

if img1_pix != img2_pix:

hamming_distance += 1

return hamming_distance

@staticmethod

def __difference(image):

"""*private method*

計算image的畫素差值

:param image: pil.image

:return: 差值陣列。0、1組成

"""resize_width = 9

resize_height = 8

# 1. resize to (9,8)

smaller_image = image.resize((resize_width, resize_height))

# 2. 灰度化 grayscale

grayscale_image = smaller_image.convert("l")

# 3. 比較相鄰畫素

pixels = list(grayscale_image.getdata())

difference =

for row in range(resize_height):

row_start_index = row * resize_width

for col in range(resize_width - 1):

left_pixel_index = row_start_index + col

return difference

@staticmethod

def __hamming_distance_with_hash(dhash1, dhash2):

"""*private method*

根據dhash值計算hamming distance

:param dhash1: str

:param dhash2: str

:return: 漢明距離(int)

參考文獻

python 實現演算法 Python實現演算法 一

1.二分查詢 def binary search mylist,item low 0 high len mylist 1 while low high mid low high 2 如果 low high 2不是偶數,python自動將mid向下圓整。guess mylist mid if gues...

k NN演算法實現k 鄰近演算法實現

將資料點 1,1.1 定義為類a,資料點 0,0.1 定義為類b k 鄰近演算法實現 計算已知類別資料集中的點與當前點之間的距離 按照距離遞增次序排序 選取與當前點距離最小的 個點 確定前 個點所在的類別的出現頻率 返回前 個點出現頻率最高的類別作為當前點的 分類 from numpy import...

c 實現rsa演算法 RSA演算法實現過程

rsa演算法是實現非對稱加密的一種演算法,其用到很多有關數論的內容,在此我們不多討論。而將目光聚焦於演算法的實現過程。rsa過程 第二步 計算n a b 61 53 3233 第三步 計算 a 1 b 1 60 52 3120 第四步 選擇與3120互質的乙個數e 17,這個e也就是我們的公鑰,需要...