PIL库将图片位深度是1、8、32统一转换为24的方法

深度学习中通常遇到各种各样的图片,位深度有的时候各不相同,容易影响训练测试,因此为了避免麻烦,一般将图片统一为位深度是24

  1. 通用转换方法
python 复制代码
from PIL import Image

def convert_to_24bit(input_path, output_path):
    """
    将任意位深度的图片转换为24位RGB图像
    
    参数:
        input_path: 输入图片路径
        output_path: 输出图片路径
    """
    # 打开图片
    img = Image.open(input_path)
    
    # 转换为RGB模式(24位)
    rgb_img = img.convert('RGB')
    
    # 保存图片
    rgb_img.save(output_path)
    print(f"转换完成: {input_path} -> {output_path}")
    print(f"原始模式: {img.mode}, 转换后模式: {rgb_img.mode}")
    print(f"原始大小: {img.size}, 转换后大小: {rgb_img.size}")
    
    return rgb_img

# 使用示例
convert_to_24bit('input.png', 'output_24bit.jpg')
  1. 针对不同位深度的详细转换方法
python 复制代码
from PIL import Image
import numpy as np

def convert_specific_bit_depth(input_path, output_path):
    """
    针对不同位深度进行详细转换
    """
    img = Image.open(input_path)
    print(f"原始图像信息:")
    print(f"  模式: {img.mode}")
    print(f"  大小: {img.size}")
    print(f"  位深度: {img.bits} (如果可用)")
    
    # 根据原始模式进行相应处理
    if img.mode == '1':  # 1位黑白图像
        print("处理1位黑白图像...")
        # 方法1: 直接转换为RGB
        rgb_img = img.convert('RGB')
        
        # 方法2: 通过L模式中转(保留更多控制)
        # gray_img = img.convert('L')
        # rgb_img = gray_img.convert('RGB')
        
    elif img.mode == 'L':  # 8位灰度图像
        print("处理8位灰度图像...")
        # 将灰度转换为RGB(三个通道值相同)
        rgb_img = img.convert('RGB')
        
    elif img.mode == 'P':  # 调色板模式(通常是4位或8位)
        print("处理调色板图像...")
        # 先转换为RGB
        if img.palette:
            print(f"  调色板模式: {img.palette.mode}")
        rgb_img = img.convert('RGB')
        
    elif img.mode == 'RGBA':  # 32位RGBA图像
        print("处理32位RGBA图像...")
        # 创建白色背景
        background = Image.new('RGB', img.size, (255, 255, 255))
        # 将RGBA图像粘贴到白色背景上
        background.paste(img, mask=img.split()[3])  # 使用alpha通道作为掩码
        rgb_img = background
        
    elif img.mode == 'CMYK':  # 32位CMYK图像
        print("处理CMYK图像...")
        rgb_img = img.convert('RGB')
        
    elif img.mode == 'RGB':  # 已经是24位
        print("图像已经是24位RGB模式")
        rgb_img = img
        
    else:  # 其他模式
        print(f"处理未知模式: {img.mode}")
        rgb_img = img.convert('RGB')
    
    # 保存图像
    rgb_img.save(output_path, quality=95)
    print(f"转换完成 -> {output_path}")
    print(f"转换后模式: {rgb_img.mode}")
    
    return rgb_img
相关推荐
m0_73691910几秒前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
getapi3 分钟前
实时音视频传输与屏幕共享(投屏)
python
java干货32 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
机器懒得学习33 分钟前
智能股票分析系统
python·深度学习·金融
毕设源码-郭学长34 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
SR_shuiyunjian37 分钟前
Python第三次作业
python
vx_biyesheji000138 分钟前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
鸽芷咕1 小时前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann
爱学习的阿磊1 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
少云清1 小时前
【金融项目实战】7_接口测试 _代码实现接口测试(重点)
python·金融项目实战