DA-CLIP关于生成多种退化图像generate_LQ.py的代码理解

生成模糊图像为例

预处理

定义排除非图像文件

IMG_EXTENSIONS = ['.jpg', '.JPG', '.jpeg', '.JPEG', '.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', 'tif']

def is_image_file(filename):
    return any(filename.endswith(extension) for extension in IMG_EXTENSIONS)

定义生成函数

# deg_type: noisy, jpeg
# param: 50 for noise_level, 10 for jpeg compression quality
def generate_LQ(deg_type='blur', param=50):
    print(deg_type, param)
    # set data dir
    sourcedir = "datasets/universal/val/noisy/GT"
    savedir = "datasets/universal/val/noisy/LQ"

    if not os.path.isdir(sourcedir):
        print("Error: No source data found")
        exit(0)
    if not os.path.isdir(savedir):
        os.mkdir(savedir)

    filepaths = [f for f in os.listdir(sourcedir) if is_image_file(f)]
    num_files = len(filepaths)

    # prepare data with augementation
    for i in range(num_files):
        filename = filepaths[i]
        print("No.{} -- Processing {}".format(i, filename))
        # read image
        image = cv2.imread(os.path.join(sourcedir, filename)) / 255.

        image_LQ = (degrade(image, deg_type, param) * 255).astype(np.uint8)

        cv2.imwrite(os.path.join(savedir, filename), image_LQ)
        

生成低质量图像

generate_LQ:这是主要的函数,它接受两个参数:deg_typeparamdeg_type指定了降低图像质量的类型(例如噪声或JPEG压缩),而param是相关的参数值(例如噪声级别或JPEG压缩质量)。

设置数据目录

sourcedirsavedir分别指定了原始图像和生成的低质量图像的存储路径。

检查目录存在性并创建

如果原始图像的目录不存在,程序会打印错误信息并退出。如果低质量图像的目录不存在,程序会创建它。

处理图像文件

程序列出sourcedir中的所有文件,并检查哪些是图像文件。

对于每个图像文件,程序会读取它,然后调用degrade函数来降低图像质量。

降低质量后的图像会保存到savedir目录下。

直接调用就行,但是degrade函数定义在下面

if __name__ == "__main__":
    generate_LQ()

在另一篇

deg_util.py

文件定义了所有退化函数配置,是一个图像处理工具集,它包含了多个函数,用于生成不同类型的噪声、应用JPEG压缩以及图像修复。这些功能对于图像处理、计算机视觉和机器学习领域的任务特别有用,比如数据增强、图像去噪、图像压缩模拟等。下面是对这些函数的详细解释:

噪声生成函数

  1. sigma_matrix2: 计算旋转的高斯噪声矩阵。
  2. mesh_grid: 生成以零为中心的网格。
  3. pdf2: 计算二元高斯分布的概率密度函数(PDF)。
  4. cdf2: 计算标准二元高斯分布的累积分布函数(CDF)。
  5. bivariate_Gaussian: 生成二元高斯核。
  6. bivariate_generalized_Gaussian: 生成二元广义高斯核。
  7. bivariate_plateau: 生成类似高原的各向异性核。
  8. random_bivariate_Gaussian: 随机生成二元高斯核。
  9. random_bivariate_generalized_Gaussian: 随机生成二元广义高斯核。
  10. random_bivariate_plateau: 随机生成二元高原核。
  11. random_mixed_kernels: 随机生成混合核。

噪声应用函数

  1. generate_gaussian_noise: 生成高斯噪声。
  2. add_gaussian_noise: 向图像添加高斯噪声。
  3. generate_gaussian_noise_pt: 使用PyTorch生成高斯噪声。
  4. add_gaussian_noise_pt: 使用PyTorch向图像添加高斯噪声。
  5. generate_poisson_noise: 生成泊松(射击)噪声。
  6. add_poisson_noise: 向图像添加泊松噪声。
  7. generate_poisson_noise_pt: 使用PyTorch生成泊松噪声。
  8. add_poisson_noise_pt: 使用PyTorch向图像添加泊松噪声。
  9. random_generate_gaussian_noise: 随机生成高斯噪声。
  10. random_add_gaussian_noise: 随机向图像添加高斯噪声。
  11. random_generate_poisson_noise: 随机生成泊松噪声。
  12. random_add_poisson_noise: 随机向图像添加泊松噪声。

JPEG压缩模拟

  1. add_jpg_compression: 模拟JPEG压缩对图像的影响。
  2. random_add_jpg_compression: 随机模拟JPEG压缩。

图像修复

  1. add_random_mask: 向图像添加随机遮罩,用于图像修复任务。

综合退化函数

  1. degrade: 根据指定的退化类型和参数,对图像进行随机退化处理。

其中degrade函数仅为某类退化调用某个函数作为样例。

def degrade(img, deg_type, param=15):
    """
    Randomly add degradation to an image

    Args:
        img (Numpy array): Input image, shape (h, w, c), range [0, 1], float32.
        degrade_types: 'noise', 'blur', 'jpeg', ...

    Returns:
        (Numpy array): Output image, shape (h, w, c), range[0, 1], float32.
    """

    if deg_type == 'noisy':
        output = add_gaussian_noise(img, sigma=param)
    elif deg_type == 'blur':
        kernel = random_mixed_kernels(['iso'], [1], kernel_size=param)
        output = cv2.filter2D(img, -1, kernel)
    elif deg_type == 'jpeg':
        output = add_jpg_compression(img, param)

    return output

以 random_mixed_kernels: 随机生成混合核,为例

def random_mixed_kernels(kernel_list,
                         kernel_prob,
                         kernel_size=21,
                         sigma_x_range=(0.6, 5),
                         sigma_y_range=(0.6, 5),
                         rotation_range=(-math.pi, math.pi),
                         betag_range=(0.5, 8),
                         betap_range=(0.5, 8),
                         noise_range=None):
    """Randomly generate mixed kernels.

    Args:
        kernel_list (tuple): a list name of kernel types,
            support ['iso', 'aniso', 'skew', 'generalized', 'plateau_iso',
            'plateau_aniso']
        kernel_prob (tuple): corresponding kernel probability for each
            kernel type
        kernel_size (int):
        sigma_x_range (tuple): [0.6, 5]
        sigma_y_range (tuple): [0.6, 5]
        rotation range (tuple): [-math.pi, math.pi]
        beta_range (tuple): [0.5, 8]
        noise_range(tuple, optional): multiplicative kernel noise,
            [0.75, 1.25]. Default: None

    Returns:
        kernel (ndarray):
    """
    kernel_type = random.choices(kernel_list, kernel_prob)[0]
    if kernel_type == 'iso':
        kernel = random_bivariate_Gaussian(
            kernel_size, sigma_x_range, sigma_y_range, rotation_range, 
            noise_range=noise_range, isotropic=True)
    elif kernel_type == 'aniso':
        kernel = random_bivariate_Gaussian(
            kernel_size, sigma_x_range, sigma_y_range, rotation_range, 
            noise_range=noise_range, isotropic=False)
    elif kernel_type == 'generalized_iso':
        kernel = random_bivariate_generalized_Gaussian(
            kernel_size,
            sigma_x_range,
            sigma_y_range,
            rotation_range,
            betag_range,
            noise_range=noise_range,
            isotropic=True)
    elif kernel_type == 'generalized_aniso':
        kernel = random_bivariate_generalized_Gaussian(
            kernel_size,
            sigma_x_range,
            sigma_y_range,
            rotation_range,
            betag_range,
            noise_range=noise_range,
            isotropic=False)
    elif kernel_type == 'plateau_iso':
        kernel = random_bivariate_plateau(
            kernel_size, sigma_x_range, sigma_y_range, rotation_range, betap_range, 
            noise_range=None, isotropic=True)
    elif kernel_type == 'plateau_aniso':
        kernel = random_bivariate_plateau(
            kernel_size, sigma_x_range, sigma_y_range, rotation_range, betap_range, 
            noise_range=None, isotropic=False)
    return kernel

random_mixed_kernels 函数旨在为图像处理任务随机生成混合核,例如对图像进行模糊或平滑处理。该函数允许根据提供的核类型列表和相应的概率来创建不同类型的核。下面是该函数的工作原理概述:

参数:
  • kernel_list:一个元组,包含可以生成的核类型的名称。支持的类型包括 'iso'(各向同性)、'aniso'(各向异性)、'skew'、'generalized'、'plateau_iso'(各向同性高原)和 'plateau_aniso'(各向异性高原)。
  • kernel_prob:一个元组,包含与 kernel_list 中每个核类型对应的概率。这些概率应该加起来为1。
  • kernel_size:要生成的核的大小。必须是奇数。
  • sigma_x_range 和 sigma_y_range:表示核在 x 和 y 维度上的标准差(sigma)范围的元组。这些参数控制核生成中高斯分布的传播。
  • rotation_range:一个元组,表示旋转角度范围(以弧度为单位)。这用于创建旋转核。
  • betag_range 和 betap_range:表示广义和高原核的 beta 参数范围的元组。Beta 参数控制这些类型核的形状。
  • noise_range(可选):一个元组,表示要添加到核中的乘性噪声范围。这用于向核引入额外的随机性。
返回值:
  • kernel:表示生成的核的 NumPy 数组。
函数操作:
  1. 函数根据提供的 kernel_list 和 kernel_prob 随机选择一个核类型。
  2. 根据选定的核类型,调用不同的函数来生成核:
    • 如果选择的是 'iso' 或 'aniso' 类型,将调用 random_bivariate_Gaussian 函数来生成高斯核。
    • 如果选择的是 'generalized_iso' 或 'generalized_aniso' 类型,将调用 random_bivariate_generalized_Gaussian 函数来生成广义高斯核。
    • 如果选择的是 'plateau_iso' 或 'plateau_aniso' 类型,将调用 random_bivariate_plateau 函数来生成高原核。

这个函数为图像处理提供了灵活性,允许用户根据需要生成多种不同类型的核,增加了处理过程中的随机性和多样性。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值