脚本如何批量调整图片噪声

wen 实用脚本 15

本文目录导读:

脚本如何批量调整图片噪声

  1. Python + OpenCV (推荐)
  2. 去噪处理(减少噪声)
  3. 使用 PIL/Pillow
  4. 命令行工具 (ImageMagick)
  5. 批量处理配置文件
  6. 安装依赖
  7. 使用建议

Python + OpenCV (推荐)

import cv2
import numpy as np
import os
from pathlib import Path
def add_noise(image, noise_type='gaussian', intensity=25):
    """添加噪声到图片"""
    if noise_type == 'gaussian':
        # 高斯噪声
        row, col, ch = image.shape
        gauss = np.random.normal(0, intensity/255.0, (row, col, ch))
        noisy = image + image * gauss
        return np.clip(noisy, 0, 255).astype(np.uint8)
    elif noise_type == 'salt_pepper':
        # 椒盐噪声
        s_vs_p = 0.5
        amount = intensity / 100
        noisy = np.copy(image)
        # 盐噪声
        num_salt = np.ceil(amount * image.size * s_vs_p)
        coords = [np.random.randint(0, i-1, int(num_salt)) for i in image.shape]
        noisy[coords[0], coords[1], :] = 255
        # 椒噪声
        num_pepper = np.ceil(amount * image.size * (1.0 - s_vs_p))
        coords = [np.random.randint(0, i-1, int(num_pepper)) for i in image.shape]
        noisy[coords[0], coords[1], :] = 0
        return noisy
    elif noise_type == 'poisson':
        # 泊松噪声
        vals = len(np.unique(image))
        vals = 2 ** np.ceil(np.log2(vals))
        noisy = np.random.poisson(image * vals) / float(vals)
        return np.clip(noisy * intensity/25, 0, 255).astype(np.uint8)
def batch_process_noise(input_dir, output_dir, noise_type='gaussian', intensity=25):
    """批量处理图片噪声"""
    # 创建输出目录
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    # 支持的图片格式
    extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff']
    # 遍历输入目录
    for filename in os.listdir(input_dir):
        if any(filename.lower().endswith(ext) for ext in extensions):
            # 读取图片
            img_path = os.path.join(input_dir, filename)
            img = cv2.imread(img_path)
            if img is not None:
                # 添加噪声
                noisy_img = add_noise(img, noise_type, intensity)
                # 保存图片
                output_path = os.path.join(output_dir, f'noisy_{filename}')
                cv2.imwrite(output_path, noisy_img)
                print(f"处理完成: {filename}")
# 使用示例
input_folder = "原始图片文件夹"
output_folder = "噪声处理后的图片"
# 调整参数:
# noise_type: 'gaussian'(高斯), 'salt_pepper'(椒盐), 'poisson'(泊松)
# intensity: 0-100,数值越大噪声越强
batch_process_noise(input_folder, output_folder, noise_type='gaussian', intensity=30)

去噪处理(减少噪声)

def denoise_image(image, method='nlm', strength=10):
    """对图片进行去噪处理"""
    if method == 'nlm':
        # 非局部均值去噪(效果好但慢)
        return cv2.fastNlMeansDenoisingColored(image, None, strength, strength, 7, 21)
    elif method == 'median':
        # 中值滤波
        return cv2.medianBlur(image, strength if strength % 2 == 1 else strength + 1)
    elif method == 'gaussian':
        # 高斯模糊
        return cv2.GaussianBlur(image, (strength if strength % 2 == 1 else strength + 1, 
                                        strength if strength % 2 == 1 else strength + 1), 0)
def batch_denoise(input_dir, output_dir, method='nlm', strength=10):
    """批量去噪"""
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.jpg', '.png', '.jpeg')):
            img = cv2.imread(os.path.join(input_dir, filename))
            if img is not None:
                denoised = denoise_image(img, method, strength)
                cv2.imwrite(os.path.join(output_dir, f'denoised_{filename}'), denoised)
                print(f"去噪完成: {filename}")

使用 PIL/Pillow

from PIL import Image, ImageFilter
import numpy as np
import os
def add_gaussian_noise_pil(image_path, output_path, intensity=0.1):
    """使用PIL添加高斯噪声"""
    img = Image.open(image_path)
    img_array = np.array(img)
    noise = np.random.normal(0, intensity * 255, img_array.shape)
    noisy_array = np.clip(img_array + noise, 0, 255).astype(np.uint8)
    noisy_img = Image.fromarray(noisy_array)
    noisy_img.save(output_path)
def batch_process_pil(input_dir, output_dir, intensity=0.1):
    """批量处理"""
    os.makedirs(output_dir, exist_ok=True)
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.jpg', '.png')):
            input_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, f'noisy_{filename}')
            add_gaussian_noise_pil(input_path, output_path, intensity)

命令行工具 (ImageMagick)

如果安装了ImageMagick,可以批量处理:

# 添加高斯噪声
# Windows PowerShell
Get-ChildItem "*.jpg" | ForEach-Object { magick $_.Name -noise 10% "noisy_$($_.Name)" }
# Linux/Mac
for img in *.jpg; do convert "$img" -noise 10% "noisy_$img"; done
# 去噪
# Windows PowerShell
Get-ChildItem "*.jpg" | ForEach-Object { magick $_.Name -median 3 "denoised_$($_.Name)" }

批量处理配置文件

# config.py - 配置文件
CONFIG = {
    "input_dir": "./images/input",
    "output_dir": "./images/output",
    "process_type": "add_noise",  # add_noise 或 denoise
    "noise_type": "gaussian",     # gaussian, salt_pepper, poisson
    "intensity": 30,              # 噪声强度 0-100
    "denoise_method": "nlm",      # nlm, median, gaussian
    "denoise_strength": 10,
    "keep_original_name": False,  # 保留原文件名
    "output_format": "jpg",       # 输出格式
    "quality": 95                 # 图片质量
}

安装依赖

pip install opencv-python pillow numpy

使用建议

  1. 测试参数:先对小批量图片测试噪声参数
  2. 备份原图:处理前备份原始图片
  3. 进度显示:大量图片时添加进度条
  4. 参数调整
    • 增加噪声:intensity=20-50
    • 减少噪声:denoise_strength=5-15
    • 强去噪:denoise_strength=15-30

选择哪种方法取决于你的具体需求:

  • 需要精细控制 → Python脚本
  • 快速批量处理 → ImageMagick
  • 简单操作 → GUI工具

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