電腦中重復圖片很多,不刪吧,占用電腦資源,刪除吧,一個一個的找,很是麻煩。還好我們會Python,畢竟python號稱是世界上無所不能的編程語言(這里請不要討論誰是世界上最好的編程語言)
1、加載所有圖片,獲取圖片的信息以及圖片路徑
2、計算每個圖片的哈希值,并保存
3、檢測每個哈希值,若相同,表明圖片相同
4、根據哈希值反推圖片的路徑,然后進行圖片的刪除,獲取其他操作
建立圖片哈希值函數
import numpy as np
import cv2
import os
def dhash(image, hashSize=8):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
resized = cv2.resize(gray, (hashSize + 1, hashSize))
diff = resized[:, 1:] > resized[:, :-1]
return sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v])
本函數的主要目的是計算每個圖片的哈希值
首先我們使用cv2.cvtColor函數把圖片從RGB空間轉換為灰度照片(便于計算)
然后使用cv2.resize函數把圖片縮?。ㄟ@里的操作也是為了快速計算)
diff = resized[:, 1:] > resized[:, :-1]來計算相鄰列像素之間的相對水平梯度
最后返回圖片的哈希值
加載圖片,計算圖片哈希值
hashes = {}
imagePaths=[]
for root, dirs, files in os.walk("dataset"):
for file in files:
imagePaths.Append(os.path.join(root, file))
for imagePath in imagePaths:
image = cv2.imread(imagePath)
h = dhash(image)
path = hashes.get(h, [])
path.append(imagePath)
hashes[h] = path
我們新建2個初識變量,一個來保存圖片路徑,一個來保存圖片路徑以及圖片哈希值的字典
首先使用os.walk("dataset")函數來獲取dataset目錄下的所有圖片
使用for循環來獲取所有圖片的路徑(絕對路徑)
使用for循環遍歷所有的圖片
image = cv2.imread(imagePath)來讀取圖片
然后使用h = dhash(image)函數來獲取圖片的哈希值
使用圖片哈希值作為key,圖片路徑作為value,來保存所有圖片的哈希值與圖片路徑
由于字典不會存在2個相同的key,所以,當圖片的哈希值相等時,我們把路徑都賦值給同一個key值
遍歷字典,獲取相同圖片
for (h, hashedPaths) in hashes.items():
if len(hashedPaths) > 1:
print("same num:", len(hashedPaths))
if -1 <= 0:
same = None
for p in hashedPaths:
image = cv2.imread(p)
image = cv2.resize(image, (150, 150))
if same is None:
same = images
else:
same = np.hstack([montage, image])
cv2.imshow("same", same)
cv2.waitKey(0)
else:
for path in hashedPaths[1:]:
os.remove(path)
我們遍歷字典,當某個key值下面對應的圖片路徑有2個或者2個以上時,這證明存在相識圖片
當檢測到相識圖片時,就可以直接執行
for path in hashedPaths[1:]:
os.remove(path)
函數來進行圖片的刪除工作,這里我們保留了第一張圖片,其他相同圖片刪除
很多時候,我們想看看相識圖片的數量以及其他信息
這里我們打印了相識圖片的數量,最后把相識的圖片顯示出來






