关于如何使用Python将批次彩色图片转换为灰度图片-详解

一.将一张彩色图片转换为灰度图片

目前使用Python将彩色图片转为灰度图片的有多种方式,例如使用Pillow库函数、OpenCV库函数、matplotlib等,此处本文就使用Pillow一种方式进行展示。具体如下:
第一步:导入处理图片的Python包

# 第一步:导入相应的包
# Pillow包包含了大量处理图像的函数
from PIL import Image

第二步:使用了Pillow库读取彩色图像

# 第二步:加载彩色图片
# 首先定义存在彩色图片的变量名称
image_path = './data/image/1.webp'
load_image = Image.open(image_path)

图片显示如下:
在这里插入图片描述
图片来自于https://img-blog.csdnimg.cn/94de71d66d4643dcb0c9f46b719b5089.png

第三步:然后将其转换为灰度图像

#第三步:处理彩色图片,将其改变为灰度图片
# PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。大家可以尝试每一种
# 1:表示将彩图为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。
# L:表示将彩色图片转换为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
# 转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
# P: 8位像素,使用调色板映射到任何其他模式,具体的功能可以区官网查看,或者自己尝试使用,但不经常使用
# RGB: 通常是对彩色图片进行加强3x8位像素,真彩色
# RGBA: 4x8位像素,带透明度掩模的真彩色
# CMYK: 4x8位像素,分色
# YCbCr: 3x8位像素,彩色视频格式
# I: 32位有符号整数像素
# F: 32位浮点像素
convert_image = load_image.convert('L')

将彩色图片转化为灰度图片如下
在这里插入图片描述
第四步:保存灰度图像文件。

convert_image.save('./data/gray_image/1L.webp')

二.批量将彩色图片转换为灰度图片
代码如下:

# 第一步:导入使用到的包
import os
from PIL import Image
# 定义文件存储和获取文件的路径
# 指定彩色图像文件夹路径和灰度图像文件夹路径
color_folder = "./data/image/"
gray_folder = "./data/gray_images/"
filenames = []
# 如果灰度图像文件夹不存在,则创建
if not os.path.exists(gray_folder):
    os.mkdir(gray_folder)
# 遍历目录下所有文件的名字
# 下面是一个示例代码,演示了如何遍历目录下的所有文件:
# 指定要遍历的目录路径,使用os.walk()函数遍历目录及其子目录下的所有文件
for root, dirs, files in os.walk(color_folder):
    for file_name in files:
        # 将文件名进行存储
        filenames.append(file_name)
# 遍历彩色图像文件夹中的所有文件
for filename in os.listdir(color_folder):
    # 打开彩色图像文件
    for filename in filenames:
        img_color = Image.open(os.path.join(color_folder, filename))
        # 转换为灰度图像
        img_gray = img_color.convert("L")
        # 保存灰度图像文件
        img_gray.save(os.path.join(gray_folder, filename))

以上代码均为业余无聊时间写出的,有什么问题欢迎大家批评指正!
其实彩色图片转换为灰度图片的应用挺多,大家可以尝试使用Opencv的库函数进行转化,目前cv2函数比较常用,大家有兴趣可以尝试一下。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
使用批次读取和处理图像是避免MemoryError的一种有效方法。具体来说,可以将数据框中的图像文件路径分成若干批次,每次读取一批图像进行处理,处理完毕后释放内存,然后再读取下一批图像进行处理,直到处理完所有图像。可以使用Python中的生成器来实现这个过程,以下是一个示例代码: ```python import numpy as np from PIL import Image def image_generator(file_paths, batch_size=32): """ 生成器函数,每次返回一个批次的图像数组和标签数组 """ start_index = 0 end_index = batch_size while start_index < len(file_paths): batch_paths = file_paths[start_index:end_index] images = [] for path in batch_paths: img = Image.open(path) img = img.resize((450, 600)) img = np.asarray(img) images.append(img) images = np.array(images) yield images start_index = end_index end_index += batch_size # 示例用法 file_paths = ["path/to/image1.jpg", "path/to/image2.jpg", ...] batch_size = 32 img_gen = image_generator(file_paths, batch_size) for batch_images in img_gen: # 对批次图像进行处理 ... ``` 在这个示例代码中,我们定义了一个生成器函数 `image_generator`,它接受一个图像文件路径列表 `file_paths` 和一个批次大小 `batch_size`。在生成器函数内部,我们使用一个循环来逐批次读取和处理图像。具体来说,我们从 `file_paths` 列表中取出一批次的图像文件路径,并使用PIL库中的 `Image.open()` 函数和NumPy库中的 `np.asarray()` 函数将每个图像读取并转换为NumPy数组。然后,我们将这一批次的图像数组存储在一个NumPy数组中,并使用 `yield` 语句将其返回。在主程序中,我们可以使用 `for` 循环来逐批次处理图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Algorithm_Engineer_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值