一般拿到一批資料需要清洗資料,比如有部分資料標記錯誤,還有一些資料重複,為了提高效率,需要把這部分重複的資料給去掉,本文介紹一種在速度和準確率都相對有優勢的相似度識別演算法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也就是我們的公鑰,需要...