[PYTHON] Détecter les dossiers avec la même image dans ImageHash

Objectif

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.

environnement d'utilisation

windows10 Anaconda python3.6.1 jupyter notebook

URL de référence

Utilisation d'ImageHash, une bibliothèque d'images similaire de Python, sous Windows

Qu'est-ce que le hachage d'image?

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.

Installation du module

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

code

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)

Résultat d'exécution

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

Détecter les dossiers avec la même image dans ImageHash
Déterminez les nombres dans l'image prise avec la webcam
[Python] Obtenez les nombres dans l'image graphique avec OCR
Convertissez l'image au format .zip en PDF avec Python
Chargez le module du même nom dans un autre emplacement
Tweet avec image en Python
Essayez de brouiller l'image avec opencv2
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
Mémorandum (Ajouter le nom uniquement aux personnes portant le même nom de famille dans la liste)
Comportement lors du retour dans le bloc with
Affichage de l'image prise avec l'ISIGHT intégré
Afficher Python 3 dans le navigateur avec MAMP
Faites un clic droit sur l'image → Réalisez "Compresser avec TinyPNG"
J'ai essayé de jouer avec l'image avec Pillow
Traitez facilement des images en Python avec Pillow
Algorithme de hachage pour déterminer la même image
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
Comment afficher dans toute la fenêtre lors de la définition de l'image d'arrière-plan avec tkinter
Transformez plusieurs listes avec l'instruction for en même temps en Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de "lisser" l'image avec Python + OpenCV
Connectez-vous à un serveur distant avec SSH
[Python] Récupérez les fichiers dans le dossier avec Python
Coupez l'image aux coins arrondis avec pythonista
Accéder aux fichiers dans le même répertoire que le fichier exécutable
J'ai essayé de "différencier" l'image avec Python + OpenCV
(Remarque) Importation d'Excel avec le même nom de colonne
Qu'est-ce que wheezy dans l'image Docker Python?
[Automation] Extraire le tableau en PDF avec Python
Programme pour rechercher la même image
Déterminer s'il y a des oiseaux dans l'image
J'ai essayé de "binariser" l'image avec Python + OpenCV
Créer une image avec des caractères avec python (japonais)
Boucle les variables en même temps dans le modèle
L'histoire qui s'inscrit dans l'installation de pip
Afficher l'image après l'augmentation des données avec Pytorch
58 Le même château
Résolution du problème selon lequel l'image n'était pas affichée dans ROMol lors du chargement avec PandasTools.LoadSDF.
Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction
Extraire le tableau des fichiers image avec OneDrive et Python
Complétez la bibliothèque mise en anaconda avec jedi-vim
J'ai essayé de détecter l'iris à partir de l'image de la caméra
Identifiez le nom de l'image de la fleur avec des keras (flux tenseur)
Explorez l'URL contenue dans le tweet Twitter avec python
Lire la liste de liens au format csv avec l'outil graphique
Ecrire des caractères dans l'illustration de la carte avec OpenCV python
Essayez de charger l'image dans un thread séparé (OpenCV-Python)
POSTER l'image avec json et la recevoir avec flask
Participé à la première ISUCON avec l'équipe "Ranchu" # ISUCON10 Qualifying
Python Open CV a essayé d'afficher l'image sous forme de texte.
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin