脚本如何批量调整图片色彩查找表

wen 实用脚本 26

本文目录导读:

脚本如何批量调整图片色彩查找表

  1. 方法一:使用 Python + Pillow 库
  2. 方法二:使用 OpenCV
  3. 方法三:使用命令行工具 (ImageMagick)
  4. 方法四:批量调整颜色属性(HSL/HSV)
  5. 方法五:支持CUBE格式的LUT文件
  6. 安装依赖
  7. 批量处理脚本示例(命令行)

我来详细介绍批量调整图片色彩查找表(LUT)的几种方法:

使用 Python + Pillow 库

from PIL import Image
import os
import numpy as np
def apply_lut_to_image(image_path, lut_path, output_path):
    """应用LUT到单张图片"""
    img = Image.open(image_path)
    # 加载自定义LUT
    with open(lut_path, 'r') as f:
        lut_data = f.read()
    # 这里需要根据LUT格式解析
    # 示例:简单的3D LUT (64x64x64)
    img = img.point(lambda p: p * 0.5)  # 示例调整
    img.save(output_path)
def batch_process_lut(input_folder, lut_path, output_folder):
    """批量处理文件夹中的所有图片"""
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    supported_formats = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(supported_formats):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            apply_lut_to_image(input_path, lut_path, output_path)
            print(f"已处理: {filename}")
# 使用示例
batch_process_lut(
    input_folder='./input_images',
    lut_path='./lut_files/my_lut.cube',
    output_folder='./output_images'
)

使用 OpenCV

import cv2
import numpy as np
import os
def create_lut_from_curve(curve):
    """从曲线数据创建LUT"""
    lut = np.zeros((256,), dtype=np.uint8)
    for i in range(256):
        # 示例:调整对比度
        lut[i] = np.clip(i * curve, 0, 255)
    return lut
def apply_lut_opencv(image_path, lut_data, output_path):
    """使用OpenCV应用LUT"""
    img = cv2.imread(image_path)
    # 应用LUT到每个通道
    result = cv2.LUT(img, lut_data)
    cv2.imwrite(output_path, result)
def batch_process_opencv(input_folder, output_folder):
    """批量处理"""
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    # 创建曲线LUT示例
    lut_r = create_lut_from_curve(1.2)  # 红色通道增强
    lut_g = create_lut_from_curve(1.0)  # 绿色通道不变
    lut_b = create_lut_from_curve(0.8)  # 蓝色通道减弱
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            apply_lut_opencv(input_path, np.stack([lut_b, lut_g, lut_r], axis=1), output_path)
            print(f"已处理: {filename}")
batch_process_opencv('./input', './output')

使用命令行工具 (ImageMagick)

#!/bin/bash
# batch_lut_adjust.sh
# 创建输出目录
mkdir -p ./output
# 批量处理所有JPG图片
for img in ./input/*.jpg; do
    filename=$(basename "$img")
    # 使用ImageMagick的hald-clut功能
    convert "$img" hald-clut:./lut.cube -fx "p{clamp(u*v*w)}" "./output/$filename"
    echo "已处理: $filename"
done
# 或者使用更简单的方法
mogrify -path ./output -hald-clut ./lut.cube ./input/*.jpg

批量调整颜色属性(HSL/HSV)

import cv2
import numpy as np
import os
def batch_adjust_colors(input_folder, output_folder, 
                       hue_shift=0, saturation_scale=1.0, lightness_scale=1.0):
    """批量调整HSL颜色属性"""
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            img = cv2.imread(os.path.join(input_folder, filename))
            # 转换为HSV
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
            # 调整各通道
            hsv[:,:,0] = (hsv[:,:,0] + hue_shift) % 180
            hsv[:,:,1] = np.clip(hsv[:,:,1] * saturation_scale, 0, 255)
            hsv[:,:,2] = np.clip(hsv[:,:,2] * lightness_scale, 0, 255)
            # 转换回BGR
            result = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
            cv2.imwrite(os.path.join(output_folder, filename), result)
            print(f"已处理: {filename}")
# 使用示例:每个通道独立调整
batch_adjust_colors(
    input_folder='./input',
    output_folder='./output',
    hue_shift=10,          # 色相偏移
    saturation_scale=1.2,  # 饱和度增强
    lightness_scale=0.9    # 亮度稍微降低
)

支持CUBE格式的LUT文件

import numpy as np
import cv2
import os
import re
def load_cube_lut(filename, size=33):
    """加载CUBE格式的LUT文件"""
    lut = np.zeros((size, size, size, 3), dtype=np.float32)
    with open(filename, 'r') as f:
        lines = f.readlines()
    data_lines = [line for line in lines if not line.startswith('#') and line.strip()]
    rgb_pattern = re.compile(r'^-?\d+\.?\d*\s+-?\d+\.?\d*\s+-?\d+\.?\d*')
    i = 0
    for line in data_lines:
        if rgb_pattern.match(line):
            r, g, b = map(float, line.strip().split()[:3])
            r_idx = (i // (size * size)) % size
            g_idx = (i // size) % size
            b_idx = i % size
            lut[r_idx, g_idx, b_idx] = [r, g, b]
            i += 1
            if i >= size**3:
                break
    return lut
def apply_cube_lut(img, lut, size=33):
    """应用CUBE LUT到图像"""
    img_float = img.astype(np.float32) / 255.0
    # 计算LUT索引
    scale = (size - 1)
    r_idx = (img_float[..., 2] * scale).astype(np.int32)
    g_idx = (img_float[..., 1] * scale).astype(np.int32)
    b_idx = (img_float[..., 0] * scale).astype(np.int32)
    # 应用LUT
    result = np.zeros_like(img_float)
    for c in range(3):
        result[..., c] = lut[r_idx, g_idx, b_idx, c]
    return (result * 255).astype(np.uint8)
def batch_process_cube_lut(input_folder, lut_path, output_folder):
    """批量处理CUBE格式的LUT"""
    lut = load_cube_lut(lut_path)
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            img = cv2.imread(os.path.join(input_folder, filename))
            result = apply_cube_lut(img, lut)
            cv2.imwrite(os.path.join(output_folder, filename), result)
            print(f"已处理: {filename}")
# 使用示例
batch_process_cube_lut('./input', './color_lut.cube', './output')

安装依赖

pip install pillow opencv-python numpy
# 或使用conda
conda install pillow opencv numpy

批量处理脚本示例(命令行)

# batch_lut_converter.py - 完整命令行工具
import argparse
import cv2
import numpy as np
import os
from glob import glob
def main():
    parser = argparse.ArgumentParser(description='批量调整图片色彩查找表')
    parser.add_argument('--input', '-i', required=True, help='输入文件夹路径')
    parser.add_argument('--output', '-o', required=True, help='输出文件夹路径')
    parser.add_argument('--lut', '-l', help='LUT文件路径')
    parser.add_argument('--hue', type=int, default=0, help='色相偏移')
    parser.add_argument('--saturation', type=float, default=1.0, help='饱和度倍数')
    parser.add_argument('--brightness', type=float, default=1.0, help='亮度倍数')
    args = parser.parse_args()
    # 这里添加处理逻辑
    # ...
if __name__ == '__main__':
    main()

选择适合你需求的方法:

  • 简单调整:使用方法四的HSL调整
  • 专业LUT:使用方法五的CUBE格式支持
  • 批量处理:推荐使用Python脚本自动化
  • 图像编辑软件:支持批处理的功能也可考虑

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