[PYTHON] Erkennen Sie Ordner mit demselben Bild in ImageHash

Zweck

Wenn das Scrape-Ziel einen Artikel aus derselben Quelle erstellt, kann dasselbe Bild mit einem anderen Titel heruntergeladen werden. Ich möchte einen Bildordner mit einem anderen Titel, aber genau demselben Inhalt erkennen und löschen.

Nutzungsumgebung

windows10 Anaconda python3.6.1 jupyter notebook

Referenz-URL

Verwenden von ImageHash, einer ähnlichen Bildbibliothek von Python unter Windows

Was ist Image Hash?

Schließen Sie beim Hashing von Bildinformationen Ihre Augen vor der Größe und den subtilen Unterschieden des Bildes und verwenden Sie diese, wenn Sie denselben Digest-Wert für ähnliche Bilder und ähnliche Digest-Werte für ähnliche Bilder erhalten möchten. Ähnliche Bildbibliothek. Es beurteilt die Ähnlichkeit unabhängig von der Ausdehnung und Größe des Bildes.

Modulinstallation

Im Fall von Anaconda ist die Installation von ImageHash abgeschlossen.

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
#Überspringen Sie keine großen Bilder
ImageFile.LOAD_TRUNCATED_IMAGES = True

#Geben Sie die Differenz zwischen den Hashwerten zweier Bilder aus
def d_hash(img,otherimg):
    hash = imagehash.phash(Image.open(img))
    other_hash = imagehash.phash(Image.open(otherimg))
    return hash-other_hash
#Erkennen Sie die kleinere Bildgröße
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
    
#Arbeitsordner angeben
directory_dir = r'C:\Users\hogehoge\images'
#Ordnerliste und Ordnerpfad abrufen
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 ]

#Holen Sie sich Bildliste, Pfad
img_list = [os.listdir(i) for i in folder_dir]
img_list_count = [ len( i ) for i in img_list ]
#Erstellen Sie eine Bildliste für jeden Ordner mit doppelter Einschlussnotation
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()Vergleichen Sie Bilder nach Ordner mit
while i < length:
    #Fortschritt
    print('i = ',i+'/'+length)
    for j in range(i+1,length):
        #Flagge zu brechen
        switch = 0
        for k in img_dir[j]:
            #Wenn die Differenz zwischen den Hashwerten 10 oder weniger beträgt, wird sie als dasselbe Bild erkannt.
            if d_hash(img_dir[i][1],k)<10:
                print(folder_list[i]+' | vs | '+folder_list[j])
                #Speichern Sie den Pfad mit der kleineren Bildgröße in der Löschliste
                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

#Zeigen Sie den Ordnerpfad an, den Sie löschen möchten
print(delete_file)

#Wenn Sie mit dem Löschen fortfahren möchten
#import shutil
#for i in delete_file:
#   shutil.rmtree(i)

Ausführungsergebnis

Der erste Ordner benötigt Zeit, aber die Anzahl der Vergleichsordner nimmt mit zunehmendem i allmählich ab. Wenn also die Verarbeitung auf die Hälfte fortschreitet, verringert sich auch der Umfang des Bildvergleichs für jeden Ordner auf die Hälfte. Unter der Annahme, dass 100 Ordner 10 Bilder enthalten, beträgt die Gesamtzahl der Schleifen ** 50500-mal **. Wenn die Parallelverarbeitung mit einem Threading-Modul usw. durchgeführt werden kann, möchte ich es in Zukunft implementieren.

Recommended Posts

Erkennen Sie Ordner mit demselben Bild in ImageHash
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR
Konvertieren Sie das Bild in .zip mit Python in PDF
Laden Sie das gleichnamige Modul an einer anderen Stelle
Tweet mit Bild in Python
Versuchen Sie, das Bild mit opencv2 zu verwischen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Memorandum (Namen nur Personen mit demselben Nachnamen in der Liste hinzufügen)
Verhalten bei der Rückkehr in den with-Block
Bildanzeige mit dem eingebauten ISIGHT
Zeigen Sie Python 3 im Browser mit MAMP an
Klicken Sie mit der rechten Maustaste auf das Bild → Realisieren Sie "Mit TinyPNG komprimieren"
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Hashing-Algorithmus zur Bestimmung des gleichen Bildes
Extrahieren Sie die Farbe des Objekts im Bild mit Mask R-CNN und K-Means Clustering
So zeigen Sie im gesamten Fenster an, wenn Sie das Hintergrundbild mit tkinter einstellen
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Melden Sie sich mit SSH bei einem Remote-Server an
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Schneiden Sie das Bild mit Pythonista auf abgerundete Ecken
Greifen Sie auf Dateien im selben Verzeichnis wie die ausführbare Datei zu
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
(Hinweis) Importieren von Excel mit demselben Spaltennamen
Was ist im Docker Python-Image pfeifend?
[Automatisierung] Extrahieren Sie die Tabelle als PDF mit Python
Programm zur Suche nach demselben Bild
Feststellen, ob das Bild Vögel enthält
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Schleifen Sie gleichzeitig Variablen in der Vorlage
Die Geschichte, die zur Installation von Pip passt
Zeigen Sie das Bild nach der Datenerweiterung mit Pytorch an
58 Das gleiche Schloss
Das Problem, dass das Bild beim Laden mit PandasTools.LoadSDF nicht in ROMol angezeigt wurde, wurde behoben.
Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Ergänzen Sie die Bibliothek in Anakonda mit jedi-vim
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Identifizieren Sie den Namen aus dem Blumenbild mit Keras (Tensorfluss)
Crawlen Sie die im Twitter-Tweet enthaltene URL mit Python
Lesen Sie die Linkliste im CSV-Format mit dem Graph-Tool
Schreiben Sie mit OpenCV-Python Zeichen in die Kartenillustration
Versuchen Sie, das Bild in einen separaten Thread zu laden (OpenCV-Python).
POST das Bild mit json und erhalte es mit der Flasche
Teilnahme an der ersten ISUCON mit dem Team "Ranchu" # ISUCON10 Qualifying
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet