Imagen de Python para leer según el tamaño del archivo
Recientemente, estaba haciendo tareas de procesamiento de imágenes. Después de
dividir las imágenes, descubrí que hay muchas iguales,
pero el orden de la lista de archivos devuelta por python os.walk () será diferente
. El código que escribí antes debe atravesar todas las imágenes. La precisión es muy alta, pero la eficiencia es particularmente baja.
Luego descubrí que las imágenes en la carpeta están ordenadas por tamaño y las imágenes similares serán adyacentes, de
modo que mientras se comparen las imágenes adyacentes, puede moverse (es decir, comparación 1 y 2, comparación 3 y 4, etc.) No es necesario atravesarlos todos. Aunque no puede ser 100% exacto, ¡la velocidad ha mejorado enormemente! Estoy feliz Atravesé las seis mil fotos antes y corrí por un día ...
Código adjunto
import os
import cv2
from skimage.measure import compare_ssim
import shutil
import random
def delete(filename1):
os.remove(filename1)
def move(filename1,filename2):
shutil.move(filename1,filename2)
if __name__ == '__main__':
path = r'C:\Users\lenovo\Desktop\image_all\0'
save_path_img = r'C:\Users\lenovo\Desktop\image_all\delete1'
os.makedirs(save_path_img, exist_ok=True)
fileMap = {}
size = 0
# 遍历filePath下的文件、文件夹(包括子目录)
for parent, dirnames, filenames in os.walk(path):
#for dirname in dirnames:
# print('parent is %s, dirname is %s' % (parent, dirname))
for filename in filenames:
# print('parent is %s, filename is %s' % (parent, filename))
# print('the full name of the file is %s' % os.path.join(parent, filename))
size = os.path.getsize(os.path.join(parent, filename))
fileMap.setdefault(os.path.join(parent, filename), size)
filelist = sorted(fileMap.items(), key=lambda d: d[1], reverse=False)
img_files= []
for filename, size in filelist:
img_files.append(filename)
# print("filename is %s , and size is %d" % (filename, size))
imgs_n = []
num = []
print(img_files)
for currIndex, filename in enumerate(img_files):
img = cv2.imread(img_files[currIndex])
img1 = cv2.imread(img_files[currIndex + 1])
ssim = compare_ssim(img, img1, multichannel=True)
if ssim > 0.9:
imgs_n.append(img_files[currIndex + 1])
print(img_files[currIndex], img_files[currIndex + 1], ssim)
else:
print('small_ssim',img_files[currIndex], img_files[currIndex + 1], ssim)
currIndex += 1
if currIndex >= len(img_files)-1:
break
for image in imgs_n:
move(image, save_path_img)
# delete(image)
La parte del código tiene algunas publicaciones en el blog, pero no sé dónde puedo verla. Perdone al autor. Puedo ver la carta privada. Adjunto el enlace de referencia.
Hee hee. Este es mi primer artículo en CSDN. Hola,
enlace al artículo: https: //blog.csdn .net / weixin_42385606 / article / details / 104718533