脚本如何批量调整图片直方图均衡

wen 实用脚本 17

本文目录导读:

脚本如何批量调整图片直方图均衡

  1. 方法1:使用 Python + OpenCV
  2. 方法2:Python + PIL (Pillow)
  3. 方法3:高级版本(支持多种均衡方法)
  4. 方法4:使用 ImageMagick(命令行工具)
  5. 使用方法
  6. 建议

方法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 "所有图片处理完成!"

使用方法

  1. Python方法:安装依赖

    pip install opencv-python pillow numpy
  2. 命令行使用高级版本

    python batch_equalize.py images output --method clahe

建议

  • CLAHE方法:通常效果最好,避免过度增强
  • 仅处理亮度通道:保持颜色自然
  • 批量前先测试:用少数图片测试效果
  • 备份原图:防止处理失误

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