Si la destination de la capture crée un article à partir de la même source, la même image avec un titre différent peut être téléchargée. Je veux détecter et supprimer un dossier d'images avec un titre différent mais exactement le même contenu.
windows10 Anaconda python3.6.1 jupyter notebook
Utilisation d'ImageHash, une bibliothèque d'images similaire de Python, sous Windows
Lors du hachage des informations d'image, fermez les yeux sur la taille et les différences subtiles de l'image et utilisez-les lorsque vous souhaitez obtenir la même valeur de résumé pour des images similaires et des valeurs de résumé similaires pour des images similaires. Bibliothèque d'images similaires. Il juge la similitude indépendamment de l'extension et de la taille de l'image.
Dans le cas d'Anaconda, seule l'installation d'ImageHash est terminée.
py
pip install numpy
pip install scipy
pip install Pillow
pip install PyWavelets
pip install ImageHash
compimages.py
from PIL import Image,ImageFile
import imagehash,os
from glob import glob
#Ne sautez pas les grandes images
ImageFile.LOAD_TRUNCATED_IMAGES = True
#Sortie de la différence entre les valeurs de hachage de deux images
def d_hash(img,otherimg):
hash = imagehash.phash(Image.open(img))
other_hash = imagehash.phash(Image.open(otherimg))
return hash-other_hash
#Détecter la plus petite taille d'image
def minhash(img,otherimg):
hash_size = Image.open(img).size
otherhash_size = Image.open(otherimg).size
if hash_size<otherhash_size: return 0
else: return 1
#Spécifiez le dossier de travail
directory_dir = r'C:\Users\hogehoge\images'
#Obtenir la liste des dossiers et le chemin du dossier
folder_list = os.listdir(directory_dir)
folder_dir = [os.path.join(directory_dir,i) for i in folder_list if len(os.listdir(os.path.join(directory_dir,i))) >2 ]
#Obtenir la liste d'images, le chemin
img_list = [os.listdir(i) for i in folder_dir]
img_list_count = [ len( i ) for i in img_list ]
#Créez une liste d'images pour chaque dossier avec une notation à double inclusion
img_dir = [ [ os.path.join(dir,list[i]) for i in range(count) if list[i] in 'jpg' or 'png'] for (count,dir,list) in zip(img_list_count, folder_dir, img_list) ]
i = 0
length = len(img_dir)
delete_file = []
#d_hash(),minhash()Comparez les images par dossier avec
while i < length:
#le progrès
print('i = ',i+'/'+length)
for j in range(i+1,length):
#Drapeau à casser
switch = 0
for k in img_dir[j]:
#Si la différence entre les valeurs de hachage est de 10 ou moins, elle est reconnue comme la même image.
if d_hash(img_dir[i][1],k)<10:
print(folder_list[i]+' | vs | '+folder_list[j])
#Enregistrez le chemin avec la plus petite taille d'image dans la liste de suppression
if minhash(img_dir[i][1],k) == 0:
delete_file.append(folder_dir[i])
else: delete_file.append(folder_dir[j])
i += 1
switch = 1
break
if switch != 0:break
i += 1
#Afficher le chemin du dossier que vous souhaitez supprimer
print(delete_file)
#Si vous souhaitez continuer la suppression
#import shutil
#for i in delete_file:
# shutil.rmtree(i)
Le premier dossier prend du temps, mais le nombre de dossiers de comparaison diminue progressivement à mesure que i augmente, donc si le traitement passe à la moitié, la quantité de comparaison d'images pour chaque dossier diminuera également de moitié. Cependant, en supposant que 100 dossiers contiennent 10 images, le nombre total de boucles est de ** 50500 fois **. S'il peut être traité en parallèle avec un module de threading, je voudrais l'implémenter à l'avenir.
Recommended Posts