Возьмите каталог изображений и измените размер всех изображений в каталоге - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь преобразовать изображения с высоким разрешением в нечто более удобное для машинного обучения.В настоящее время у меня есть код для изменения размера изображения до желаемой высоты и ширины, однако мне нужно делать одно изображение за раз, что неплохо, когда я делаю только 12-24 изображения, но скоро я хочу увеличитьсделать несколько сотен изображений.Я пытаюсь прочитать в каталоге, а не отдельные изображения и сохранить новые изображения в новом каталоге.Исходные изображения будут отличаться от .jpg, .png, .tif и т. Д., Но я бы хотел, чтобы все выходные изображения были такими же .png, как в моем коде.

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)

Любая помощь с этой проблемой приветствуется.

Ответы [ 5 ]

2 голосов
/ 06 марта 2019

Вы можете использовать это:

#!/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()
2 голосов
/ 06 марта 2019

Предполагается, что решение, которое вы ищете, заключается в одновременной обработке нескольких изображений - вот решение.См. здесь для получения дополнительной информации.

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'])) 
2 голосов
/ 06 марта 2019

Вы можете перебрать содержимое каталога с помощью

import os

for root, subdirs, files in os.walk(MY_DIRECTORY):
    for f in files:
        if f.endswith('png'):
            #do something 
1 голос
/ 06 марта 2019

Вы можете просмотреть все изображения внутри каталога, используя glob. Затем измените размеры изображений с помощью opencv, как указано ниже или как вы сделали с 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 голосов
/ 09 июля 2019

Я использовал:

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