3
votes

Prenez un répertoire d'images et redimensionnez toutes les images du répertoire

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.


2 commentaires

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


7 Réponses :


2
votes

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 


0 commentaires

1
votes

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)))


0 commentaires

4
votes

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'])) 


0 commentaires

3
votes

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()


0 commentaires

1
votes

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()


0 commentaires

1
votes

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


1 commentaires

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.



0
votes

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)


0 commentaires