本文目录导读:

方法1:使用 Python + OpenCV
import cv2
import os
import glob
from pathlib import Path
def batch_histogram_equalization(input_folder, output_folder, file_pattern="*.jpg"):
"""
批量进行直方图均衡化
"""
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 获取所有图片文件
image_files = glob.glob(os.path.join(input_folder, file_pattern))
for img_path in image_files:
# 读取图片
img = cv2.imread(img_path)
if img is None:
print(f"无法读取: {img_path}")
continue
# 转换为YUV色彩空间(只对亮度通道做均衡)
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
# 转换回BGR
img_equalized = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
# 保存结果
filename = Path(img_path).name
output_path = os.path.join(output_folder, f"equalized_{filename}")
cv2.imwrite(output_path, img_equalized)
print(f"已处理: {filename}")
# 使用方法
batch_histogram_equalization("input_folder", "output_folder")
方法2:Python + PIL (Pillow)
from PIL import Image
import os
import glob
def batch_equalize_pil(input_folder, output_folder):
"""
使用PIL进行批量直方图均衡
"""
os.makedirs(output_folder, exist_ok=True)
# 支持的图片格式
extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp']
for ext in extensions:
for img_path in glob.glob(os.path.join(input_folder, ext)):
# 打开图片
img = Image.open(img_path).convert('RGB')
# 分离RGB通道
r, g, b = img.split()
# 对每个通道进行均衡
from PIL import ImageOps
r_eq = ImageOps.equalize(r)
g_eq = ImageOps.equalize(g)
b_eq = ImageOps.equalize(b)
# 合并通道
img_eq = Image.merge('RGB', (r_eq, g_eq, b_eq))
# 保存
filename = os.path.basename(img_path)
output_path = os.path.join(output_folder, f"eq_{filename}")
img_eq.save(output_path)
print(f"已处理: {filename}")
# 使用方法
batch_equalize_pil("images", "equalized_images")
方法3:高级版本(支持多种均衡方法)
import cv2
import numpy as np
import os
from pathlib import Path
import argparse
class ImageEqualizer:
def __init__(self, method='clahe'):
"""
method: 'histogram' - 普通直方图均衡
'clahe' - 自适应直方图均衡
'contrast_stretch' - 对比度拉伸
"""
self.method = method
self.clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
def equalize(self, img):
"""根据选择的均衡方法处理图片"""
if self.method == 'histogram':
return self._histogram_equalization(img)
elif self.method == 'clahe':
return self._clahe_equalization(img)
elif self.method == 'contrast_stretch':
return self._contrast_stretching(img)
else:
return img
def _histogram_equalization(self, img):
"""普通直方图均衡"""
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
return cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
def _clahe_equalization(self, img):
"""自适应直方图均衡(CLAHE)"""
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = self.clahe.apply(img_yuv[:,:,0])
return cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
def _contrast_stretching(self, img):
"""对比度拉伸"""
# 转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算累积直方图
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
cdf = hist.cumsum()
cdf_normalized = cdf / cdf[-1]
# 找到最小和最大强度
min_val = np.argmax(cdf_normalized > 0.05)
max_val = np.argmax(cdf_normalized > 0.95)
# 应用对比度拉伸
stretched = cv2.normalize(gray, None, min_val, max_val, cv2.NORM_MINMAX)
return cv2.cvtColor(stretched, cv2.COLOR_GRAY2BGR)
def batch_process(input_folder, output_folder, method='clahe'):
"""批量处理主函数"""
equalizer = ImageEqualizer(method)
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 支持的文件格式
extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff']
processed = 0
for ext in extensions:
for img_path in Path(input_folder).glob(ext):
try:
# 读取图片
img = cv2.imread(str(img_path))
if img is None:
print(f"跳过无法读取的文件: {img_path}")
continue
# 均衡处理
img_eq = equalizer.equalize(img)
# 保存结果
output_path = Path(output_folder) / f"{method}_{img_path.name}"
cv2.imwrite(str(output_path), img_eq)
processed += 1
print(f"处理完成 ({processed}): {img_path.name}")
except Exception as e:
print(f"处理 {img_path} 时出错: {e}")
print(f"\n总计处理 {processed} 张图片")
# 命令行接口
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='批量图片直方图均衡')
parser.add_argument('input_folder', help='输入文件夹路径')
parser.add_argument('output_folder', help='输出文件夹路径')
parser.add_argument('--method', choices=['histogram', 'clahe', 'contrast_stretch'],
default='clahe', help='均衡方法')
args = parser.parse_args()
batch_process(args.input_folder, args.output_folder, args.method)
方法4:使用 ImageMagick(命令行工具)
#!/bin/bash
# save as batch_equalize.sh
INPUT_DIR="input_images"
OUTPUT_DIR="equalized_images"
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 批量处理所有jpg图片
for img in "$INPUT_DIR"/*.jpg; do
filename=$(basename "$img")
echo "处理: $filename"
# 使用ImageMagick的-equalize选项
convert "$img" -equalize "$OUTPUT_DIR/eq_$filename"
done
echo "所有图片处理完成!"
使用方法
-
Python方法:安装依赖
pip install opencv-python pillow numpy
-
命令行使用高级版本:
python batch_equalize.py images output --method clahe
建议
- CLAHE方法:通常效果最好,避免过度增强
- 仅处理亮度通道:保持颜色自然
- 批量前先测试:用少数图片测试效果
- 备份原图:防止处理失误