本文目录导读:

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
使用建议
- 测试参数:先对小批量图片测试噪声参数
- 备份原图:处理前备份原始图片
- 进度显示:大量图片时添加进度条
- 参数调整:
- 增加噪声:intensity=20-50
- 减少噪声:denoise_strength=5-15
- 强去噪:denoise_strength=15-30
选择哪种方法取决于你的具体需求:
- 需要精细控制 → Python脚本
- 快速批量处理 → ImageMagick
- 简单操作 → GUI工具