生成模糊图像为例
预处理
定义排除非图像文件
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_type
和param
。deg_type
指定了降低图像质量的类型(例如噪声或JPEG压缩),而param
是相关的参数值(例如噪声级别或JPEG压缩质量)。
设置数据目录:
sourcedir
和savedir
分别指定了原始图像和生成的低质量图像的存储路径。
检查目录存在性并创建:
如果原始图像的目录不存在,程序会打印错误信息并退出。如果低质量图像的目录不存在,程序会创建它。
处理图像文件:
程序列出sourcedir
中的所有文件,并检查哪些是图像文件。
对于每个图像文件,程序会读取它,然后调用degrade
函数来降低图像质量。
降低质量后的图像会保存到savedir
目录下。
直接调用就行,但是degrade
函数定义在下面
if __name__ == "__main__":
generate_LQ()
在另一篇
deg_util.py
文件定义了所有退化函数配置,是一个图像处理工具集,它包含了多个函数,用于生成不同类型的噪声、应用JPEG压缩以及图像修复。这些功能对于图像处理、计算机视觉和机器学习领域的任务特别有用,比如数据增强、图像去噪、图像压缩模拟等。下面是对这些函数的详细解释:
噪声生成函数
sigma_matrix2
: 计算旋转的高斯噪声矩阵。mesh_grid
: 生成以零为中心的网格。pdf2
: 计算二元高斯分布的概率密度函数(PDF)。cdf2
: 计算标准二元高斯分布的累积分布函数(CDF)。bivariate_Gaussian
: 生成二元高斯核。bivariate_generalized_Gaussian
: 生成二元广义高斯核。bivariate_plateau
: 生成类似高原的各向异性核。random_bivariate_Gaussian
: 随机生成二元高斯核。random_bivariate_generalized_Gaussian
: 随机生成二元广义高斯核。random_bivariate_plateau
: 随机生成二元高原核。random_mixed_kernels
: 随机生成混合核。
噪声应用函数
generate_gaussian_noise
: 生成高斯噪声。add_gaussian_noise
: 向图像添加高斯噪声。generate_gaussian_noise_pt
: 使用PyTorch生成高斯噪声。add_gaussian_noise_pt
: 使用PyTorch向图像添加高斯噪声。generate_poisson_noise
: 生成泊松(射击)噪声。add_poisson_noise
: 向图像添加泊松噪声。generate_poisson_noise_pt
: 使用PyTorch生成泊松噪声。add_poisson_noise_pt
: 使用PyTorch向图像添加泊松噪声。random_generate_gaussian_noise
: 随机生成高斯噪声。random_add_gaussian_noise
: 随机向图像添加高斯噪声。random_generate_poisson_noise
: 随机生成泊松噪声。random_add_poisson_noise
: 随机向图像添加泊松噪声。
JPEG压缩模拟
add_jpg_compression
: 模拟JPEG压缩对图像的影响。random_add_jpg_compression
: 随机模拟JPEG压缩。
图像修复
add_random_mask
: 向图像添加随机遮罩,用于图像修复任务。
综合退化函数
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 数组。
函数操作:
- 函数根据提供的
kernel_list
和kernel_prob
随机选择一个核类型。 - 根据选定的核类型,调用不同的函数来生成核:
- 如果选择的是 'iso' 或 'aniso' 类型,将调用
random_bivariate_Gaussian
函数来生成高斯核。 - 如果选择的是 'generalized_iso' 或 'generalized_aniso' 类型,将调用
random_bivariate_generalized_Gaussian
函数来生成广义高斯核。 - 如果选择的是 'plateau_iso' 或 'plateau_aniso' 类型,将调用
random_bivariate_plateau
函数来生成高原核。
- 如果选择的是 'iso' 或 'aniso' 类型,将调用
这个函数为图像处理提供了灵活性,允许用户根据需要生成多种不同类型的核,增加了处理过程中的随机性和多样性。