将一个图像目录中的所有图片进行调整大小

5

我试图将高分辨率图像转换为机器学习更易管理的格式。目前我有一段代码可以将图像调整为任意高度和宽度,但是我必须逐个处理图像,当我只处理12-24个图像时还好,但很快我想扩展到数百个图像。

我试图读取一个文件夹而不是单独的图像,并将新图像保存在一个新文件夹中。初始图像可能是.jpb、.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)

非常感谢您对这个问题的帮助。


你的程序的问题是每次实例化只能转换一个图像吗? - Mitch
1
这里有一个相当综合的分析,介绍如何做到这一点... https://dev59.com/m2oy5IYBdhLWcg3wUcb_#51822265 - Mark Setchell
8个回答

4
假设您要处理多个图像的解决方案 - 下面是一个解决方法。更多信息请参见此处
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'])) 

3
你可以使用这个:
#!/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

你可以使用以下代码循环遍历目录中的内容:

import os

for root, subdirs, files in os.walk(MY_DIRECTORY):
    for f in files:
        if f.endswith('png'):
            #do something 

2
你可以使用 glob 遍历目录中的所有图像。然后使用以下代码或者你之前使用 PIL 的方式来调整图像大小,使用 opencv 库。"Original Answer" 翻译成 "最初的回答"。
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)))

1

我使用了:

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

1
你可以使用以下代码来调整多张图片的大小并在转换后保存到同一文件夹中,比如(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

0
from PIL import Image
import os
images_dir_path=' '

def image_rescaling(path):
    for img in os.listdir(path):
        img_dir=os.path.join(path,img)
        img = Image.open(img_dir)
        img = img.resize((224, 224)) 
        img.save(img_dir)
image_rescaling(images_dir_path)

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - NameVergessen

0
你可以尝试在Python中使用PIL库来调整图像大小。
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)

我需要一段多页代码,这样输出也应该是多页tiff图像。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接