在Python中批量读取图片的方法有多种,包括使用os
库、glob
库和图像处理库如PIL
(Pillow)或OpenCV
等。通过这些方法,可以快速高效地读取文件夹中的多张图片并进行处理。使用os库遍历目录、glob库模式匹配、结合PIL或OpenCV进行图像读取,是实现批量读取图片的有效方法。下面我们详细介绍如何使用这些工具和库实现这一过程。
一、使用OS库批量读取图片
os
库是Python标准库的一部分,可以用来处理文件和目录。通过os.listdir()
方法,我们可以列出指定目录下的所有文件,并结合文件名后缀判断,筛选出图片文件。
使用os库
-
遍历目录文件
首先,使用
os.listdir()
方法列出目录中的所有文件,并通过循环遍历这些文件,使用字符串方法检查文件名后缀,判断是否为图片文件。常见的图片文件后缀包括.jpg
、.jpeg
、.png
等。import os
def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img = os.path.join(folder, filename)
images.append(img)
return images
-
读取图片
读取图片可以使用
PIL
库的Image.open()
方法或OpenCV
库的cv2.imread()
方法。下面是使用PIL读取图片的示例:from PIL import Image
def load_and_show_images(folder):
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img = Image.open(os.path.join(folder, filename))
img.show() # 显示图片
使用OpenCV读取图片的示例:
import cv2
def load_and_show_images_cv(folder):
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img = cv2.imread(os.path.join(folder, filename))
cv2.imshow('image', img) # 显示图片
cv2.waitKey(0)
cv2.destroyAllWindows()
二、使用GLOB库批量读取图片
glob
库是Python标准库的一部分,支持使用通配符进行文件搜索。相比于os
,glob
更简洁,可以直接通过模式匹配选择指定类型的文件。
使用glob库
-
使用通配符模式匹配
使用
glob.glob()
方法结合通配符模式,可以快速获取指定类型的文件路径列表。例如,匹配所有.jpg
和.png
文件:import glob
def load_images_with_glob(folder):
pattern = os.path.join(folder, "*.jpg")
images = glob.glob(pattern)
images.extend(glob.glob(os.path.join(folder, "*.png")))
return images
-
读取图片
在获取图片路径列表后,可以使用前面提到的PIL或OpenCV方法读取图片。
from PIL import Image
def load_and_show_images_with_glob(folder):
images = load_images_with_glob(folder)
for img_path in images:
img = Image.open(img_path)
img.show()
三、使用PIL批量读取图片
PIL(Python Imaging Library)是一个强大的图像处理库,Pillow是PIL的一个友好的分支,提供了更丰富的功能和更好的兼容性。
使用PIL
-
读取和处理图片
使用PIL可以轻松读取、显示、保存和修改图片。除了基本的读取操作外,PIL还支持各种图像处理操作,如调整大小、旋转、滤镜等。
from PIL import Image
import os
def process_images_with_pil(folder):
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img_path = os.path.join(folder, filename)
img = Image.open(img_path)
img = img.resize((100, 100)) # 调整大小
img = img.rotate(45) # 旋转45度
img.show()
-
保存处理后的图片
处理后的图片可以使用
img.save()
方法进行保存,指定保存路径和文件格式。def save_processed_images(folder, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img_path = os.path.join(folder, filename)
img = Image.open(img_path)
img = img.resize((100, 100))
img.save(os.path.join(output_folder, filename))
四、使用OpenCV批量读取图片
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理功能。
使用OpenCV
-
读取和显示图片
使用OpenCV的
cv2.imread()
方法读取图片,cv2.imshow()
方法显示图片。import cv2
import os
def process_images_with_cv2(folder):
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img_path = os.path.join(folder, filename)
img = cv2.imread(img_path)
img = cv2.resize(img, (100, 100)) # 调整大小
cv2.imshow('Processed Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
-
保存处理后的图片
使用
cv2.imwrite()
方法保存处理后的图片。def save_processed_images_cv2(folder, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(folder):
if filename.endswith(".jpg") or filename.endswith(".png"):
img_path = os.path.join(folder, filename)
img = cv2.imread(img_path)
img = cv2.resize(img, (100, 100))
cv2.imwrite(os.path.join(output_folder, filename), img)
通过以上方法,我们可以在Python中灵活地批量读取和处理图片。选择合适的库和方法,可以有效提高图像处理的效率和灵活性。无论是进行简单的批量读取,还是在此基础上进行更复杂的图像处理操作,掌握这些技巧都将为你的Python编程提供强大的支持。
相关问答FAQs:
**如何在Python中批量读取图片文件?