本文目录导读:

方法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方法:通常效果最好,避免过度增强
- 仅处理亮度通道:保持颜色自然
- 批量前先测试:用少数图片测试效果
- 备份原图:防止处理失误
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播