本文目录导读:

- 方法一:使用 Python + Pillow 库
- 方法二:使用 OpenCV
- 方法三:使用命令行工具 (ImageMagick)
- 方法四:批量调整颜色属性(HSL/HSV)
- 方法五:支持CUBE格式的LUT文件
- 安装依赖
- 批量处理脚本示例(命令行)
我来详细介绍批量调整图片色彩查找表(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脚本自动化
- 图像编辑软件:支持批处理的功能也可考虑