4. 图像色相偏移
任务说明
对输入图像执行色相通道的随机偏移,生成多张色相变化后的增强图像,用于提升模型对色彩偏移的鲁棒性。核心操作是将RGB图像转换到HSV色彩空间,仅调整H(色相)通道,保持S(饱和度)与V(明度)不变,再转换回RGB输出。
环境依赖
需要 numpy 与 opencv-python(或 Pillow + numpy)。以下实现基于OpenCV,因其内置高效的RGB/HSV互转函数。
关键完整代码
import cv2
import numpy as np
def random_hue_shift(image, delta_range=(-30, 30), num_augmented=4, seed=None):
"""
对图像进行随机色相偏移增强。
参数:
image: 输入BGR图像 (H,W,3),uint8类型
delta_range: 色相偏移范围(度),OpenCV中H通道范围为0~179
num_augmented: 生成的增强图像数量
seed: 随机种子,用于复现
返回:
list of augmented BGR images
"""
if seed is not None:
np.random.seed(seed)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV).astype(np.int16)
h_channel = hsv[:, :, 0]
augmented_images = []
for _ in range(num_augmented):
delta = np.random.uniform(delta_range[0], delta_range[1])
# 色相偏移并做环形处理(0~179循环)
new_h = (h_channel + delta) % 180
hsv_copy = hsv.copy()
hsv_copy[:, :, 0] = new_h
# 转回uint8并还原为BGR
hsv_uint8 = np.clip(hsv_copy, 0, 255).astype(np.uint8)
augmented = cv2.cvtColor(hsv_uint8, cv2.COLOR_HSV2BGR)
augmented_images.append(augmented)
return augmented_images
if __name__ == "__main__":
# 最小可复现示例:生成一张测试图并执行增强
test_img = np.zeros((100, 100, 3), dtype=np.uint8)
test_img[:, :, 0] = 255 # B通道=255 → 蓝色
test_img[:, :, 1] = 0 # G=0
test_img[:, :, 2] = 0 # R=0
results = random_hue_shift(test_img, delta_range=(-60, 60), num_augmented=3, seed=42)
print(f"生成增强图像数量: {len(results)}")
for i, img in enumerate(results):
# 验证输出尺寸与类型
assert img.shape == test_img.shape and img.dtype == np.uint8
# 验证色相确实发生变化:蓝色(HSV中H=120)偏移后不应仍为纯蓝
hsv_out = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h_val = int(hsv_out[50, 50, 0])
print(f"第{i+1}张中心像素H值: {h_val} (原图H=120)")
运行与验证
直接运行脚本:python hue_shift.py。预期输出3张增强图,每张中心像素的H值因随机偏移而不同(种子固定为42时,偏移量确定,H值会偏离120)。若取消固定种子,每次运行结果不同。
通过条件:程序无异常退出,输出3张尺寸与类型正确的图像,且打印的H值均不等于120(证明色相已偏移)。如需保存图像,在循环内添加 cv2.imwrite(f"aug_{i}.jpg", img) 即可。
常见问题
- 色相偏移后颜色异常:确保偏移量在0~179范围内做环形处理(代码已用
% 180),否则超出范围会导致错误映射。 - 数据类型错误:HSV转换后需转为int16再进行加减,避免uint8溢出;最后需clip回0~255并转回uint8。
- 偏移范围选择:±30度适合轻微色彩扰动,±60度可生成明显色变样本。实际训练中建议根据任务调整,避免过度破坏语义信息。