在代码中使用的增强:
- 对数变换
- 降低饱和度
- 高斯模糊
- 调整图像亮度
参数调整(在 Transformation.py中):
- 22行(对数变换):如果
c
的值大于1,对比度会增加;如果c
的值小于1,对比度会减少。 - 37行(调整饱和度):系数值越小,饱和度降低的效果越明显;系数值越接近1,饱和度降低的效果越不明显。
- 44行(高斯噪声):通常情况下,这个值设置为0,因为高斯噪声通常是无偏的,但你可以根据需要将其设置为其他值。
- 45行(高斯噪声):较小的
sigma
值会产生较弱的噪声,而较大的sigma
值会产生较强的噪声。 - 50行(高斯模糊):它代表了高斯模糊的核大小。核大小决定了模糊的程度,核越大,图像越模糊。
包含文件夹:
1.将main.py、Transformation_mix.py放在同一个目录下
2.数据存放格式
main.py
import os
import cv2
import numpy as np
import Transformation
import Transformation
#读取文件中所有文件
def get_file_names(folder):
file_names = []
for file_name in os.listdir(folder):
file_names.append(file_name)
return file_names
path = r'datasets'改成自己的路径
#将读取到的文件名称存储到all_file_name里
all_file_name = get_file_names(path)
#遍历每个类别
for files in all_file_name:
#加一个限制条件,如果文件名称为after就跳过
if files != 'after':
#遍历第一个类下面的图像
#总的文件夹名称+类别文件夹名称=类别文件夹路径
save_path = os.path.join(path, 'after')
save_path = os.path.join(save_path,files)
# 检查文件夹是否存在
if not os.path.exists(save_path):
# 如果文件夹不存在,创建一个新文件夹
os.makedirs(save_path)
print(f"Directory {save_path} created.")
else:
print(f"Directory {save_path} already exists.")
#每个类别文件夹的路径
type_path = os.path.join(path, files)
#遍历类别文件夹下的所有图片
images = []
for file in os.listdir(type_path):
if file.lower().endswith(('.jpg', '.png')):
images.append(file)
#type_path + file =图片总路径
image_path = os.path.join(type_path, file)
# 读取图像
img = cv2.imread(image_path)
#去除图像名称后缀,方便后续命名
img_name = file[:-4]
#对图像进行增强
img_after = Transformation.augment_data(img, save_path, img_name)
#如果文件名称是after就跳过
else:
continue
# print(files,'类别的数量为',len(images)) #打印类别数量
Transformation.py
import cv2
import os
import numpy as np
from PIL import Image
from skimage.util import random_noise #添加噪声模块
import PIL
from torchvision import transforms
def augment_data(img, save_path, file_name):
# img是图像本身
# save_path是除了图像以外的路径
# file_name是图像名字
# 首先保存原始图像
file_name_jpg = file_name + '.jpg'
org_path = os.path.join(save_path, file_name_jpg)
cv2.imwrite(org_path, img)
print("Saved augmented image:", org_path)
# 进行对数变换
# 进行对数变换
c = 1 # 对数变换的参数,可根据需要调整
img_blurred_float = img.astype(np.float32) # 转换为浮点数以进行对数变换
# 添加一个小的常数以避免对0取对数
enhanced_image = c * np.log(1 + img_blurred_float + 1e-10)
# 归一化到0-255
min_val = np.min(enhanced_image)
max_val = np.max(enhanced_image)
enhanced_image = (enhanced_image - min_val) / (max_val - min_val) * 255
enhanced_image = np.clip(enhanced_image, 0, 255).astype(np.uint8)
# 将图像从BGR转换到HSV颜色空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 降低饱和度
s = img_hsv[:, :, 1]
s = cv2.multiply(s, 0.35) # 0.5为饱和度降低的系数,越接近0,效果越明显
img_hsv[:, :, 1] = s
# 将图像从HSV转换回BGR颜色空间
img_desaturated = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
# 添加高斯噪声
mean = 0
sigma = 0.6 # 高斯噪声的标准差
gaussian_noise = np.random.normal(mean, sigma, img_desaturated.shape).astype('uint8')
img_noisy = cv2.add(img_desaturated, gaussian_noise)
# 添加高斯模糊
kernel_size = (13, 13) # 高斯模糊的核大小
img_blurred = cv2.GaussianBlur(img_noisy, kernel_size, 0)
# 转换回HSV颜色空间以提高亮度
img_enhanced_hsv = cv2.cvtColor(img_blurred, cv2.COLOR_BGR2HSV)
# 提高亮度
v_channel = img_enhanced_hsv[:, :, 2]
v_channel = cv2.add(v_channel, 0) # 增加亮度,数值可以根据需要调整
v_channel = np.clip(v_channel, 0, 255) # 限制亮度值在0到255之间
img_enhanced_hsv[:, :, 2] = v_channel
# 转换回BGR颜色空间
final_image = cv2.cvtColor(img_enhanced_hsv, cv2.COLOR_HSV2BGR)
# 保存图像
file_name_enhanced = file_name + '_after.jpg' # 替换为所需的文件名
img_name_enhanced = os.path.join(save_path, file_name_enhanced)
cv2.imwrite(img_name_enhanced, final_image)
print("Saved enhanced image:", img_name_enhanced)