脚本如何批量调整图片色彩空间转换

wen 实用脚本 25

本文目录导读:

脚本如何批量调整图片色彩空间转换

  1. 使用 Python + Pillow (PIL)
  2. 使用 ImageMagick (命令行)
  3. Python + OpenCV
  4. 批量转换脚本 (通用版)
  5. 使用方法
  6. 常见色彩模式说明

使用 Python + Pillow (PIL)

import os
from PIL import Image
import glob
def batch_convert_images(input_dir, output_dir, target_mode='RGB'):
    """
    批量转换图片色彩空间
    :param input_dir: 输入目录
    :param output_dir: 输出目录
    :param target_mode: 目标色彩模式 (RGB, CMYK, LAB, HSV, Grayscale 等)
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    # 支持的图片格式
    image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff']
    for ext in image_extensions:
        for img_path in glob.glob(os.path.join(input_dir, ext)):
            try:
                # 打开图片
                img = Image.open(img_path)
                # 转换色彩空间
                if target_mode == 'CMYK':
                    converted_img = img.convert('CMYK')
                elif target_mode == 'Lab':
                    converted_img = img.convert('LAB')
                elif target_mode == 'HSV':
                    converted_img = img.convert('HSV')
                elif target_mode == 'Grayscale':
                    converted_img = img.convert('L')  # L 表示灰度
                else:  # 默认 RGB
                    converted_img = img.convert('RGB')
                # 保存图片
                filename = os.path.basename(img_path)
                output_path = os.path.join(output_dir, filename)
                converted_img.save(output_path)
                print(f"转换完成: {filename} -> {target_mode}")
            except Exception as e:
                print(f"转换失败 {img_path}: {str(e)}")
# 使用示例
if __name__ == "__main__":
    # 批量转换图片为 CMYK
    batch_convert_images(
        input_dir="./input_images",
        output_dir="./output_cmyk",
        target_mode='CMYK'
    )

使用 ImageMagick (命令行)

#!/bin/bash
# 批量转换所有 JPG 图片为 CMYK
for file in ./input/*.{jpg,jpeg,png}; do
    if [ -f "$file" ]; then
        filename=$(basename "$file")
        convert "$file" -colorspace CMYK "./output/cmyk_${filename%.*}.jpg"
        echo "转换完成: $filename"
    fi
done

Python + OpenCV

import cv2
import os
import glob
import numpy as np
def batch_color_space_conversion(input_dir, output_dir, conversion_type='RGB_TO_HSV'):
    """
    使用 OpenCV 批量转换色彩空间
    :param conversion_type: 'RGB_TO_HSV', 'RGB_TO_LAB', 'RGB_TO_YCrCb' 等
    """
    os.makedirs(output_dir, exist_ok=True)
    # 转换类型映射
    conversions = {
        'RGB_TO_HSV': cv2.COLOR_RGB2HSV,
        'RGB_TO_LAB': cv2.COLOR_RGB2LAB,
        'RGB_TO_YCrCb': cv2.COLOR_RGB2YCrCb,
        'RGB_TO_HLS': cv2.COLOR_RGB2HLS,
        'BGR_TO_RGB': cv2.COLOR_BGR2RGB,
        'BGR_TO_GRAY': cv2.COLOR_BGR2GRAY
    }
    conversion_code = conversions.get(conversion_type, cv2.COLOR_RGB2HSV)
    for img_path in glob.glob(os.path.join(input_dir, "*.*")):
        try:
            # 读取图片 (OpenCV 默认 BGR)
            img = cv2.imread(img_path)
            if img is None:
                continue
            # 转换色彩空间
            converted = cv2.cvtColor(img, conversion_code)
            # 保存图片
            filename = os.path.basename(img_path)
            output_path = os.path.join(output_dir, f"converted_{filename}")
            cv2.imwrite(output_path, converted)
            print(f"转换完成: {filename}")
        except Exception as e:
            print(f"转换失败 {img_path}: {str(e)}")
# 使用示例
batch_color_space_conversion(
    input_dir="./input",
    output_dir="./output",
    conversion_type='RGB_TO_HSV'
)

批量转换脚本 (通用版)

#!/usr/bin/env python3
"""
通用色彩空间批量转换工具
"""
import argparse
import os
from PIL import Image
import glob
from concurrent.futures import ThreadPoolExecutor
import tqdm
def convert_single_image(args):
    """单个图片转换函数"""
    img_path, output_dir, target_mode = args
    try:
        img = Image.open(img_path)
        filename = os.path.basename(img_path)
        # 转换色彩空间
        converted_img = convert_color_mode(img, target_mode)
        # 保存
        output_path = os.path.join(output_dir, f"converted_{filename}")
        converted_img.save(output_path)
        return (filename, True, None)
    except Exception as e:
        return (img_path, False, str(e))
def convert_color_mode(img, mode):
    """转换色彩模式"""
    modes = {
        'RGB': 'RGB',
        'RGBA': 'RGBA',
        'CMYK': 'CMYK',
        'GRAY': 'L',  # 灰度
        'HSV': 'HSV',
        'LAB': 'LAB'
    }
    target_mode = modes.get(mode.upper(), 'RGB')
    return img.convert(target_mode)
def main():
    parser = argparse.ArgumentParser(description='批量图片色彩空间转换工具')
    parser.add_argument('input_dir', help='输入目录')
    parser.add_argument('output_dir', help='输出目录')
    parser.add_argument('--mode', default='RGB', 
                       choices=['RGB', 'CMYK', 'GRAY', 'HSV', 'LAB'],
                       help='目标色彩模式')
    parser.add_argument('--threads', type=int, default=4, help='线程数')
    parser.add_argument('--extensions', nargs='+', default=['*.jpg', '*.png'],
                       help='文件扩展名')
    args = parser.parse_args()
    # 创建输出目录
    os.makedirs(args.output_dir, exist_ok=True)
    # 收集所有图片路径
    image_paths = []
    for ext in args.extensions:
        image_paths.extend(glob.glob(os.path.join(args.input_dir, ext)))
    print(f"找到 {len(image_paths)} 个图片文件")
    # 准备参数
    convert_args = [(path, args.output_dir, args.mode) for path in image_paths]
    # 多线程转换
    with ThreadPoolExecutor(max_workers=args.threads) as executor:
        results = list(tqdm.tqdm(
            executor.map(convert_single_image, convert_args),
            total=len(convert_args),
            desc="转换进度"
        ))
    # 统计结果
    success = [r for r in results if r[1]]
    failed = [r for r in results if not r[1]]
    print(f"\n转换完成:")
    print(f"成功: {len(success)} 个")
    print(f"失败: {len(failed)} 个")
    if failed:
        print("\n失败的图片:")
        for f in failed:
            print(f"  - {f[0]}: {f[2]}")
if __name__ == "__main__":
    main()

使用方法

安装依赖:

pip install Pillow opencv-python tqdm

命令行使用:

# 基本用法
python batch_convert.py ./input ./output --mode CMYK
# 指定文件类型
python batch_convert.py ./input ./output --mode GRAY --extensions *.jpg *.png
# 多线程处理
python batch_convert.py ./input ./output --mode HSV --threads 8

常见色彩模式说明

  • RGB: 红绿蓝(屏幕显示)
  • CMYK: 青品黄黑(打印输出)
  • GRAY: 灰度图
  • HSV: 色相饱和度明度
  • LAB: 亮度A通道B通道(人眼感知)

这些脚本可以根据您的具体需求进行调整,包括文件类型、色彩模式、输出路径等。

抱歉,评论功能暂时关闭!