一.变暗处理

先直接给出代码,再进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def imadjust(x, a, b, c, d, gamma2=1):
        y = (((x - a) / (b - a+1e-5)) ** gamma2) * (d - c) + c
        return y

def poisson_gaussian_noise(x, severity):
    c_poisson = 10 * [60, 25, 12, 5, 3][severity]
    x = np.array(x)
    if x.max() > 255 or x.min() < 0:
        print(f"Warning: Input image values out of range: min={x.min()}, max={x.max()}")

    x = np.clip(x, 0, 255) / 255.
    try:
        x = np.clip(np.random.poisson(x * c_poisson) / c_poisson, 0, 1) * 255
        c_gauss = 0.1 * [.08, .12, 0.18, 0.26, 0.38][severity]
        x = np.array(x) / 255.
        x = np.clip(x + np.random.normal(size=x.shape, scale= c_gauss), 0, 1) * 255
    except Exception as e:
        print("Poisson noise parameter c_poisson:", c_poisson)
        print("Noise level severity:", severity)
        print("Image data x:", x)
        print("Image shape x.shape:", x.shape)
        print("Image minimum value x.min():", x.min())
        print("Image maximum value x.max():", x.max())
        print("Gaussian noise parameter c_gauss:", c_gauss)
        print(f"Error occurred during noise addition: {str(e)}")
    return Image.fromarray(np.uint8(x))

def low_light(x, severity):
    c = [0.60, 0.50, 0.40, 0.30, 0.20][severity-1]
    x = np.array(x) / 255.
    x_scaled = imadjust(x, x.min(), x.max(), 0, c, gamma2=2) * 255
    x_scaled = poisson_gaussian_noise(x_scaled, severity=severity-1)
    return x_scaled

def create_dark(img1):
    """
    Create corruptions: 'Dark'.
    Parameters:
        image: Input image
        severity_lower: Lower bound of severity (inclusive)
        severity_upper: Upper bound of severity (inclusive)
    Returns:
        Image with dark lighting interference
    """
    severity_lower=1
    severity_upper=5
    severity = random.randint(severity_lower, severity_upper)
    img_corrupted = low_light(img1, severity=severity)
    return img_corrupted


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_dark(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

从create_dark()函数开始看起,随机选择黑暗的严重程度1-5,使用random.randint(severity_lower, severity_upper)在1-5之间随机选择随机数,然后跳转到low_light()函数。

c = [0.60, 0.50, 0.40, 0.30, 0.20][severity-1],是从一个列表中根据严重程度(severity)选择对应的暗度系数c,如果severity=3,c = [0.60, 0.50, 0.40, 0.30, 0.20][3-1] = [0.60, 0.50, 0.40, 0.30, 0.20][2]= 0.40,意味着图像的最亮部分会被压缩到原始亮度的40%,整体图像会明显变暗。

然后再将将像素值转换到[0,1]范围,使用x = np.array(x) / 255.。使用imadjust调整图像亮度,x_scaled = imadjust(x, x.min(), x.max(), 0, c, gamma2=2) * 255,其中imadjust()将输入范围[x.min(), x.max()]映射到输出范围[0, c],gamma2=2应用伽马校正,增强暗部细节,乘以255将图像转换回[0,255]范围。

poisson_gaussian_noise函数中,c_poisson = 10 * [60, 25, 12, 5, 3][severity] # 严重程度越高,噪声越大,x = np.clip(np.random.poisson(x * c_poisson) / c_poisson, 0, 1) * 255,用于添加泊松噪声;c_gauss = 0.1 * [.08, .12, 0.18, 0.26, 0.38][severity]  # 严重程度越高,噪声越大,x = np.clip(x + np.random.normal(size=x.shape, scale=c_gauss), 0, 1) * 255,用于添加高斯噪声。模拟了暗光环境下相机传感器的噪声特性。

效果展示

        

二.霜冻图像

先直接给出代码,再进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_frost(image):
    """
    Create corruptions: 'Frost'.
    """
    severity_lower=1
    severity_upper=5
    corruption = 'frost'
    severity = random.randint(severity_lower, severity_upper)
    image = np.array(image)
    try:
        corrupted = corrupt(image, corruption_name=corruption, severity=severity)
        im = transforms.ToPILImage()(corrupted)
    except Exception as e:
        print("Error image path:")
        print("Frost parameter severity:", severity)
        print(f"Error occurred during noise addition: {str(e)}")    
    return im

img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_fog(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

设置严重程度,在1-5之间随机选择随机数,random.randint(severity_lower, severity_upper),同时指定要应用的 corruption 类型为'frost',直接调用函数即可corrupted = corrupt(image, corruption_name=corruption, severity=severity)

效果展示

       

三.添加雪花

直接给出代码,再进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_snow(image):
    """
    Create corruptions: 'Snow'.
    """
    severity_lower=1
    severity_upper=5
    corruption = 'snow'
    severity = random.randint(severity_lower, severity_upper)
    image = np.array(image)
    try:
        corrupted = corrupt(image, corruption_name=corruption, severity=severity)
        im = transforms.ToPILImage()(corrupted)
    except Exception as e:
        print("Error image path:")
        print("Snow parameter severity:", severity)
        print(f"Error occurred during noise addition: {str(e)}")
    return im


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_snow(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

同上,只需要改corruption 类型为'snow'即可。

效果展示

四.gamma变换

直接给出代码,再进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_gamma(image):
    gamma  = 0.2
    corrected = np.clip((image/255.0) ** gamma * 255, 0, 255).astype(np.uint8)
    return corrected


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_gamma(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

Gamma变化是一种非线性亮度调整技术,主要用于校正图像的亮度响应。

输入亮度 vs 输出亮度关系:
- Gamma=0.2: 暗部大幅拉伸,亮部压缩
- Gamma=1.0: 线性关系
- Gamma=2.2: 暗部压缩,亮部拉伸

首先代码定义了gamma值为0.2,表明增强暗部,(image/255.0)将像素值从[0,255]转换到[0,1]浮点数范围,便于进行幂运算。(...) ** gamma对每个像素值进行幂运算,应用Gamma校正。(...) * 255将[0,1]范围内的值映射回[0,255],np.clip(..., 0, 255).astype(np.uint8)确保所有值在[0,255]范围内,astype(np.uint8):转换为8位无符号整数(图像标准格式)。

效果展示

五.添加运动模糊

直接给吹代码,再进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_motion_blur(image):
    """
    Create corruptions: 'Motion Blur'.
    """
    severity_lower=1
    severity_upper=5
    corruption = 'motion_blur'
    severity = random.randint(severity_lower, severity_upper)
    image = np.array(image)

    corrupted = corrupt(image, corruption_name=corruption, severity=severity)
    im = transforms.ToPILImage()(corrupted)

    return im


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_snow(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

同上,只需要改corruption 类型为'motion_blur'即可。

效果展示

六.添加缩放模糊

直接给出代码,在进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_zoom_blur(image):
    """
    Create corruptions: 'Zoom Blur'.
    """
    severity_lower=1
    severity_upper=5
    corruption = 'zoom_blur'
    severity = random.randint(severity_lower, severity_upper)
    image=np.array(image)
    try:
        corrupted = corrupt(image, corruption_name=corruption, severity=severity)
        im = transforms.ToPILImage()(corrupted)
    except Exception as e:
        print("Error image path:")
        print("Zoom blur parameter severity:", severity)
        print(f"Error occurred during noise addition: {str(e)}")  
    im = transforms.ToPILImage()(corrupted)
    return im


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_snow(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

同上,只需要改corruption 类型为'zoom_blur'即可。

效果展示

七.添加对比

 直接给出代码,在进行解释

import numpy as np
from PIL import Image
import random
import cv2
import os
from imagecorruptions import corrupt
from torchvision import transforms

def create_contrast(image):
    """
    Create corruptions: 'Contrast'.
    """
    severity_lower=1
    severity_upper=5
    corruption = 'contrast'
    severity = random.randint(severity_lower, severity_upper)
    image=np.array(image)
    try:
        corrupted = corrupt(image, corruption_name=corruption, severity=severity)
        im = transforms.ToPILImage()(corrupted)
    except Exception as e:
        print("Error image path:")
        print("Contrast parameter severity:", severity)
        print(f"Error occurred during noise addition: {str(e)}")
    im = transforms.ToPILImage()(corrupted)
    return im


img_folder = "test"
out_folder = "output"
os.makedirs(out_folder, exist_ok=True)
support = ('.png', '.jpg')

for filename in os.listdir(img_folder):
     if filename.lower().endswith(support):
          input_path = os.path.join(img_folder, filename)
          output_path = os.path.join(out_folder, filename)

          img = cv2.imread(input_path)
          img_process = create_snow(img)
          img_process = np.array(img_process)
          cv2.imwrite(output_path, img_process)
          print(f"Processing file: {filename}")

同上,只需要改corruption 类型为'contrast'即可。

效果展示

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐