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