本文目录导读:

- 方法一:使用 Python + Pillow 库
- 方法二:使用 OpenCV + 自适应直方图均衡
- 方法三:自定义直方图匹配
- 方法四:使用 ImageMagick 命令行批量处理
- 方法五:使用 Photoshop 动作(人工辅助)
- 建议使用场景
使用 Python + Pillow 库
from PIL import Image, ImageOps
import os
import glob
def batch_equalize_histogram(input_folder, output_folder):
"""批量直方图均衡化"""
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 获取所有图片文件
image_files = glob.glob(os.path.join(input_folder, "*.[jp][pn][g]"))
image_files += glob.glob(os.path.join(input_folder, "*.png"))
for img_path in image_files:
# 打开图片
img = Image.open(img_path)
# 直方图均衡化
if img.mode == 'RGB':
# RGB图片需要分别处理每个通道
img_equalized = ImageOps.equalize(img)
else:
# 灰度图片直接处理
img_equalized = ImageOps.equalize(img)
# 保存结果
filename = os.path.basename(img_path)
output_path = os.path.join(output_folder, f"equalized_{filename}")
img_equalized.save(output_path)
print(f"处理完成: {filename}")
# 使用示例
batch_equalize_histogram("input_images", "output_images")
使用 OpenCV + 自适应直方图均衡
import cv2
import numpy as np
import os
import glob
def batch_clahe_equalization(input_folder, output_folder, clip_limit=2.0, grid_size=(8,8)):
"""使用CLAHE(对比度受限自适应直方图均衡)批量处理"""
os.makedirs(output_folder, exist_ok=True)
# 创建CLAHE对象
clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)
# 获取所有图片
image_files = glob.glob(os.path.join(input_folder, "*.[jp][pn][g]"))
image_files += glob.glob(os.path.join(input_folder, "*.png"))
for img_path in image_files:
# 读取图片
img = cv2.imread(img_path)
# 转换到LAB颜色空间
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
# 对L通道应用CLAHE
l_equalized = clahe.apply(l)
# 合并通道
lab_equalized = cv2.merge([l_equalized, a, b])
img_equalized = cv2.cvtColor(lab_equalized, cv2.COLOR_LAB2BGR)
# 保存结果
filename = os.path.basename(img_path)
output_path = os.path.join(output_folder, f"clahe_{filename}")
cv2.imwrite(output_path, img_equalized)
print(f"处理完成: {filename}")
# 使用示例
batch_clahe_equalization("input_images", "output_images", clip_limit=2.0)
自定义直方图匹配
import cv2
import numpy as np
import os
def match_histogram(source, target):
"""将源图像的直方图匹配到目标图像的直方图"""
# 转换到LAB颜色空间
source_lab = cv2.cvtColor(source, cv2.COLOR_BGR2LAB)
target_lab = cv2.cvtColor(target, cv2.COLOR_BGR2LAB)
matched = np.zeros_like(source)
for i in range(3):
# 计算每个通道的直方图
src_hist, _ = np.histogram(source_lab[:,:,i], 256, [0,256])
tgt_hist, _ = np.histogram(target_lab[:,:,i], 256, [0,256])
# 计算累积直方图
src_cdf = np.cumsum(src_hist) / src_hist.sum()
tgt_cdf = np.cumsum(tgt_hist) / tgt_hist.sum()
# 创建映射表
mapping = np.zeros(256, dtype=np.uint8)
for j in range(256):
diff = np.abs(tgt_cdf - src_cdf[j])
mapping[j] = np.argmin(diff)
# 应用映射
matched[:,:,i] = mapping[source_lab[:,:,i]]
return cv2.cvtColor(matched, cv2.COLOR_LAB2BGR)
def batch_histogram_matching(input_folder, reference_image_path, output_folder):
"""批量直方图匹配"""
os.makedirs(output_folder, exist_ok=True)
# 读取参考图像
reference = cv2.imread(reference_image_path)
# 获取所有图片
image_files = [f for f in os.listdir(input_folder)
if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
for filename in image_files:
img_path = os.path.join(input_folder, filename)
img = cv2.imread(img_path)
# 直方图匹配
matched_img = match_histogram(img, reference)
# 保存结果
output_path = os.path.join(output_folder, f"matched_{filename}")
cv2.imwrite(output_path, matched_img)
print(f"处理完成: {filename}")
# 使用示例
batch_histogram_matching("input_images", "reference.jpg", "output_images")
使用 ImageMagick 命令行批量处理
# 1. 直方图均衡化
mogrify -path output_folder -equalize *.jpg
# 2. 对比度增强
mogrify -path output_folder -contrast-stretch 5%x95% *.jpg
# 3. 色彩调整
mogrify -path output_folder -level 10%,90% *.jpg
# 4. 使用脚本批量处理
for file in *.jpg; do
convert "$file" -equalize "output/${file%.jpg}_equalized.jpg"
done
使用 Photoshop 动作(人工辅助)
-
创建动作:
- 录制一个直方图调整动作
- 包含:图像 → 调整 → 色阶/曲线
-
批量处理:
- 文件 → 自动 → 批处理
- 选择源文件夹和目标文件夹
- 应用创建的动作
建议使用场景
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Pillow均衡化 | 简单快速调整 | 代码简单,适合批量 | 效果单一 |
| OpenCV CLAHE | 细节增强 | 控制精细,效果好 | 参数需调整 |
| 直方图匹配 | 统一风格 | 可参考目标图像 | 需要参考图 |
| ImageMagick | 命令行操作 | 无需编程 | 功能有限 |
| Photoshop | 人工精细调整 | 效果可控 | 批量效率低 |
选择合适的方法取决于你的具体需求、技术栈和期望效果,对于大多数批量处理需求,OpenCV的CLAHE方法通常能获得较好的平衡效果。