J'essaie de convertir des images haute résolution en quelque chose de plus gérable pour l'apprentissage automatique. Actuellement, j'ai le code pour redimensionner les images à la hauteur et à la largeur que je veux, mais je dois faire une image à la fois, ce qui n'est pas mal quand je ne fais que des images 12-24, mais bientôt je veux agrandir faire quelques centaines d'images. J'essaie de lire dans un répertoire plutôt que des images individuelles et d'enregistrer les nouvelles images dans un nouveau répertoire. Les images initiales varieront de .jpg, .png, .tif, etc. mais j'aimerais que toutes les images de sortie soient au format .png comme je l'ai dans mon code.
import os from PIL import Image filename = "filename.jpg" size = 250, 250 file_parts = os.path.splitext(filename) outfile = file_parts[0] + '_250x250' + file_parts[1] try: img = Image.open(filename) img = img.resize(size, Image.ANTIALIAS) img.save(outfile, 'PNG') except IOError as e: print("An exception occured '%s'" %e)
Toute aide avec ce problème est appréciée.
7 Réponses :
Vous pouvez parcourir le contenu d'un répertoire avec
import os for root, subdirs, files in os.walk(MY_DIRECTORY): for f in files: if f.endswith('png'): #do something
Vous pouvez parcourir toutes les images du répertoire en utilisant glob
. Et puis redimensionnez les images avec opencv
comme suit ou comme vous l'avez fait avec PIL
.
import glob import cv2 import numpy as np IMG_DIR='home/xx/imgs' def read_images(directory): for img in glob.glob(directory+"/*.png"): image = cv2.imread(img) resized_img = cv2.resize(image/255.0 , (250 , 250)) yield resized_img resized_imgs = np.array(list(read_images(IMG_DIR)))
En supposant que la solution que vous recherchez est de gérer plusieurs images en même temps - voici une solution. Voir ici pour plus d'informations.
from multiprocessing import Pool def handle_image(image_file): print(image_file) #TODO implement the image manipulation here if __name__ == '__main__': p = Pool(5) # 5 as an example # assuming you know how to prepare image file list print(p.map(handle_image, ['a.jpg', 'b.jpg', 'c.png']))
Vous pouvez utiliser ceci:
#!/usr/bin/python from PIL import Image import os, sys path = "\\path\\to\\files\\" dirs = os.listdir( path ) def resize(): for item in dirs: if os.path.isfile(path+item): im = Image.open(path+item) f, e = os.path.splitext(path+item) imResize = im.resize((200,100), Image.ANTIALIAS) imResize.save(f+'.png', 'png', quality=80) resize()
J'ai utilisé:
from PIL import Image import os, sys path = os.path.dirname(os.path.abspath(__file__)) dirs = os.listdir( path ) final_size = 244 print(dirs) def resize_aspect_fit(): for item in dirs: if ".PNG" in item: print(item) im = Image.open(path+"\\"+item) f, e = os.path.splitext(path+"\\"+item) size = im.size print(size) ratio = float(final_size) / max(size) new_image_size = tuple([int(x*ratio) for x in size]) im = im.resize(new_image_size, Image.ANTIALIAS) new_im = Image.new("RGB", (final_size, final_size)) new_im.paste(im, ((final_size-new_image_size[0])//2, (final_size-new_image_size[1])//2)) print(f) new_im.save(f + 'resized.jpg', 'JPEG', quality=400)# png resize_aspect_fit()
Vous pouvez utiliser ce code pour redimensionner plusieurs images et les enregistrer après la conversion dans le même dossier pour disons des dimensions de (200,200):
import os from PIL import Image f = r' ' #Enter the location of your Image Folder new_d = 200 for file in os.listdir(f): f_img = f+'/'+file try: img = Image.open(f_img) img = img.resize((new_d, new_d)) img.save(f_img) except IOError: pass
Que se passe-t-il lorsqu'une non-image est rencontrée? Il est recommandé d'effectuer une vérification des erreurs même si vous pensez que ce sont toutes des images.
vous pouvez essayer d'utiliser la bibliothèque PIL pour redimensionner les images en python
import PIL import os import os.path from PIL import Image path = r'your images path here' for file in os.listdir(path): f_img = path+"/"+file img = Image.open(f_img) img = img.resize((100, 100)) #(width, height) img.save(f_img)
Le problème est-il que votre programme ne peut convertir qu'une seule image à chaque fois que vous l'instanciez?
Il existe une analyse assez complète de la façon de procéder ici ... stackoverflow.com/a/51822265/2836621