【计算机视觉】数据增强实现
【代码】计算机视觉部分数据增强实现【Python】
·
目录
- 增加对比度
import cv2
import numpy as np
import os
def modify_contrast(input_folder, output_folder, contrast_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 修改对比度
modified_image = modify_contrast_of_image(image, contrast_factor)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'recontrast_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def modify_contrast_of_image(image, contrast_factor):
adjusted_image = np.int16(image) # 将图像转换为int16类型,方便计算
adjusted_image = adjusted_image * contrast_factor # 修改对比度
adjusted_image = np.clip(adjusted_image, 0, 255) # 将像素值限制在0-255范围内
adjusted_image = np.uint8(adjusted_image) # 将图像转换回uint8类型
return adjusted_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 对比度调整因子(大于1增加对比度,小于1减少对比度)
contrast_factor = 1.1
# 批量进行修改对比度处理并保存
modify_contrast(input_folder, output_folder, contrast_factor)
-
降低对比度
import cv2
import numpy as np
import os
def modify_contrast(input_folder, output_folder, contrast_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 修改对比度
modified_image = modify_contrast_of_image(image, contrast_factor)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'recontrast_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def modify_contrast_of_image(image, contrast_factor):
adjusted_image = np.int16(image) # 将图像转换为int16类型,方便计算
adjusted_image = adjusted_image * contrast_factor # 修改对比度
adjusted_image = np.clip(adjusted_image, 0, 255) # 将像素值限制在0-255范围内
adjusted_image = np.uint8(adjusted_image) # 将图像转换回uint8类型
return adjusted_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 对比度调整因子(大于1增加对比度,小于1减少对比度)
contrast_factor = 0.8
# 批量进行修改对比度处理并保存
modify_contrast(input_folder, output_folder, contrast_factor)
-
增加饱和度
import cv2
import numpy as np
import os
def modify_saturation(input_folder, output_folder, saturation_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 修改饱和度
modified_image = modify_saturation_of_image(image, saturation_factor)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'resaturation_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def modify_saturation_of_image(image, saturation_factor):
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 将图像转换为HSV颜色空间
hsv_image[:, :, 1] = hsv_image[:, :, 1] * saturation_factor # 修改饱和度
modified_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) # 将图像转换回BGR颜色空间
return modified_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 饱和度调整因子 (0.0-1.0之间的值,值越大饱和度越高)
saturation_factor = 2
# 批量进行修改饱和度处理并保存
modify_saturation(input_folder, output_folder, saturation_factor)
-
降低饱和度
import cv2
import numpy as np
import os
def modify_saturation(input_folder, output_folder, saturation_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 修改饱和度
modified_image = modify_saturation_of_image(image, saturation_factor)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'resaturation_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def modify_saturation_of_image(image, saturation_factor):
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 将图像转换为HSV颜色空间
hsv_image[:, :, 1] = hsv_image[:, :, 1] * saturation_factor # 修改饱和度
modified_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) # 将图像转换回BGR颜色空间
return modified_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 饱和度调整因子 (0.0-1.0之间的值,值越大饱和度越高)
saturation_factor = 0.5
# 批量进行修改饱和度处理并保存
modify_saturation(input_folder, output_folder, saturation_factor)
-
增加亮度
import cv2
import os
def increase_brightness(input_folder, output_folder, brightness_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 在RGB颜色空间中增加亮度
adjusted_image = cv2.convertScaleAbs(image, alpha=brightness_factor, beta=0)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'change_brightness_' + filename)
cv2.imwrite(output_path, adjusted_image)
print(f'Adjusted image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 提亮因子
brightness_factor = 1.2
# 批量进行提亮处理并保存
increase_brightness(input_folder, output_folder, brightness_factor)
-
降低亮度
import cv2
import os
def decrease_brightness(input_folder, output_folder, brightness_factor):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 在RGB颜色空间中减少亮度
adjusted_image = cv2.convertScaleAbs(image, alpha=1/brightness_factor, beta=0)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'change_brightness_' + filename)
cv2.imwrite(output_path, adjusted_image)
print(f'Adjusted image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 变暗因子
brightness_factor = 1.7
# 批量进行变暗处理并保存
decrease_brightness(input_folder, output_folder, brightness_factor)
-
锐化
import cv2
import numpy as np
import os
def random_sharpen(input_folder, output_folder, min_strength, max_strength):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 随机锐化处理
modified_image = random_sharpen_image(image, min_strength, max_strength)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'sharpen_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def random_sharpen_image(image, min_strength, max_strength):
# 随机生成锐化强度
strength = np.random.uniform(min_strength, max_strength)
# 创建锐化核
kernel = np.array([[-1, -1, -1],
[-1, 9 + strength, -1],
[-1, -1, -1]])
# 应用锐化核
sharpened_image = cv2.filter2D(image, -1, kernel)
return sharpened_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 锐化强度范围
min_strength = 0.01
max_strength = 0.03
# 批量进行随机锐化处理并保存
random_sharpen(input_folder, output_folder, min_strength, max_strength)
-
模糊处理
import cv2
import os
def blur_images(input_folder, output_folder, kernel_size):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 模糊处理
blurred_image = cv2.blur(image, (kernel_size, kernel_size))
# 写入输出文件夹
output_path = os.path.join(output_folder, 'blur_' + filename)
cv2.imwrite(output_path, blurred_image)
print(f"Blurred image saved: {output_path}")
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 模糊核大小,必须为奇数
kernel_size = 5
# 批量进行模糊处理并保存
blur_images(input_folder, output_folder, kernel_size)
-
尺寸缩放
import cv2
import os
def resize_images(input_folder, output_folder, target_size):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 调整图像尺寸
resized_image = cv2.resize(image, target_size)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'resize_' + filename)
cv2.imwrite(output_path, resized_image)
print(f'Resized image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 目标尺寸
target_size = (1200, 200)
# 调整图像尺寸并保存
resize_images(input_folder, output_folder, target_size)
-
随机剪裁
import cv2
import os
import random
def crop_images(input_folder, output_folder, crop_size):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 随机生成剪裁的起始坐标
height, width, _ = image.shape
start_x = random.randint(0, width - crop_size)
start_y = random.randint(0, height - crop_size)
# 剪裁图像
cropped_image = image[start_y:start_y + crop_size, start_x:start_x + crop_size]
# 写入输出文件夹
output_path = os.path.join(output_folder, 'retailor_' + filename)
cv2.imwrite(output_path, cropped_image)
print(f'Cropped image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 剪裁尺寸
crop_size = 256
# 批量剪裁图像并保存
crop_images(input_folder, output_folder, crop_size)
-
变形处理
import cv2
import os
import numpy as np
def transform_images(input_folder, output_folder, transform_matrix):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 进行变形处理
transformed_image = cv2.warpAffine(image, transform_matrix, (image.shape[1], image.shape[0]))
# 写入输出文件夹
output_path = os.path.join(output_folder, 'deform_' + filename)
cv2.imwrite(output_path, transformed_image)
print(f'Transformed image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 定义仿射变换矩阵
# 这里以水平翻转为例
transform_matrix = np.array([[-1, 0, 0],
[0, 1, 0]], dtype=np.float32)
# 批量进行变形处理并保存
transform_images(input_folder, output_folder, transform_matrix)
-
旋转处理
import cv2
import os
import math
def rotate_images(input_folder, output_folder, angle):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 获取图像的中心点坐标
height, width = image.shape[:2]
center = (width // 2, height // 2)
# 定义旋转矩阵
matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
# 进行旋转操作
rotated_image = cv2.warpAffine(image, matrix, (width, height))
# 写入输出文件夹
output_path = os.path.join(output_folder, 'rotation_' + filename)
cv2.imwrite(output_path, rotated_image)
print(f'Rotated image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 旋转角度(单位:度)
angle = 45
# 批量旋转图像并保存
rotate_images(input_folder, output_folder, angle)
-
翻转处理
import cv2
import os
def flip_images(input_folder, output_folder, flip_code):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 进行翻转操作
flipped_image = cv2.flip(image, flip_code)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'resupination_' + filename)
cv2.imwrite(output_path, flipped_image)
print(f'Flipped image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 翻转方式:
# 0:水平翻转,大约沿y轴旋转180度
# 1:垂直翻转,大约沿x轴旋转180度
# -1:同时进行水平和垂直翻转,大约沿x和y轴旋转180度
flip_code = -1
# 批量翻转图像并保存
flip_images(input_folder, output_folder, flip_code)
-
像素平移
import cv2
import os
import numpy as np
def shift_pixels(input_folder, output_folder, shift_x, shift_y):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 平移图像
M = np.float32([[1, 0, shift_x], [0, 1, shift_y]])
shifted_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 写入输出文件夹
output_path = os.path.join(output_folder, 'shift_' + filename)
cv2.imwrite(output_path, shifted_image)
print(f'Shifted image saved: {output_path}')
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 像素平移量
shift_x = 130
shift_y = 100
# 批量进行像素平移处理并保存
shift_pixels(input_folder, output_folder, shift_x, shift_y)
-
添加噪声
import cv2
import numpy as np
import os
def add_noise(input_folder, output_folder, noise_type, intensity):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 添加噪声
noisy_image = add_noise_to_image(image, noise_type, intensity)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'noise_' + filename)
cv2.imwrite(output_path, noisy_image)
print(f"Noisy image saved: {output_path}")
def add_noise_to_image(image, noise_type, intensity):
if noise_type == 'gaussian':
noisy_image = add_gaussian_noise(image, intensity)
elif noise_type == 'salt_and_pepper':
noisy_image = add_salt_and_pepper_noise(image, intensity)
else:
raise ValueError("Invalid noise type. Supported noise types: 'gaussian', 'salt_and_pepper'")
return noisy_image
def add_gaussian_noise(image, intensity):
row, col, ch = image.shape
mean = 0
std_dev = intensity
gauss = np.random.normal(mean, std_dev, (row, col, ch))
gauss = gauss.reshape(row, col, ch)
noisy_image = image + gauss
noisy_image = np.clip(noisy_image, 0, 255).astype(np.uint8)
return noisy_image
def add_salt_and_pepper_noise(image, intensity):
row, col, ch = image.shape
noisy_image = np.copy(image)
salt_pepper_pixels = np.random.rand(row, col) < intensity / 2
salt_pixels = salt_pepper_pixels & (np.random.rand(row, col) < 0.5)
pepper_pixels = salt_pepper_pixels & ~salt_pixels
noisy_image[salt_pixels, :] = 255
noisy_image[pepper_pixels, :] = 0
return noisy_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 噪声类型: 'gaussian'(高斯噪声) 或 'salt_and_pepper'(椒盐噪声)
noise_type = "gaussian"
# 噪声强度
intensity = 1
# 批量进行添加噪声处理并保存
add_noise(input_folder, output_folder, noise_type, intensity)
-
随机透视
import cv2
import numpy as np
import os
def random_perspective(input_folder, output_folder, max_distortion):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
# 读取图像
image_path = os.path.join(input_folder, filename)
image = cv2.imread(image_path)
# 随机透视处理
modified_image = random_perspective_transform(image, max_distortion)
# 写入输出文件夹
output_path = os.path.join(output_folder, 'perspective_' + filename)
cv2.imwrite(output_path, modified_image)
print(f"Modified image saved: {output_path}")
def random_perspective_transform(image, max_distortion):
# 随机生成透视变换的四个角点
height, width = image.shape[:2]
x1 = np.random.randint(0, width // max_distortion)
y1 = np.random.randint(0, height // max_distortion)
x2 = np.random.randint(width - width // max_distortion, width)
y2 = np.random.randint(0, height // max_distortion)
x3 = np.random.randint(width - width // max_distortion, width)
y3 = np.random.randint(height - height // max_distortion, height)
x4 = np.random.randint(0, width // max_distortion)
y4 = np.random.randint(height - height // max_distortion, height)
# 定义原始图像四个角点
src_points = np.array([(0, 0), (width, 0), (width, height), (0, height)], dtype=np.float32)
# 定义透视变换后的四个角点
dst_points = np.array([(x1, y1), (x2, y2), (x3, y3), (x4, y4)], dtype=np.float32)
# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
# 进行透视变换
transformed_image = cv2.warpPerspective(image, M, (width, height))
return transformed_image
# 输入文件夹路径
input_folder = ""
# 输出文件夹路径
output_folder = ""
# 最大透视畸变程度
max_distortion = 4
# 批量进行随机透视处理并保存
random_perspective(input_folder, output_folder, max_distortion)
更多推荐
所有评论(0)