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.
windows10 Anaconda python3.6.1 jupyter notebook
Verwenden von ImageHash, einer ähnlichen Bildbibliothek von Python unter Windows
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.
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
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)
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.