• 图像增强技术与OpenCV实现


    图像增强技术与OpenCV实现

    机器学习和深度学习领域,数据增强(Data Augmentation)是一种通过增加训练数据多样性来提高模型泛化能力的重要技术。特别是对于图像数据集,数据增强可以有效地增加样本量,防止模型过拟合。本文将介绍几种常用的图像增强技术及其OpenCV实现方法。

    1. 基本几何变换

    1.1 旋转(Rotation)

    旋转是对图像进行顺时针或逆时针的旋转操作,这样可以让模型适应不同角度的图像。以下是一个旋转图像的函数示例:

    import cv2
    import numpy as np
    
    def rotate_image(image, angle):
        (h, w) = image.shape[:2]
        center = (w // 2, h // 2)
        M = cv2.getRotationMatrix2D(center, angle, 1.0)
        rotated = cv2.warpAffine(image, M, (w, h))
        return rotated
    

    1.2 缩放(Scaling)

    缩放是调整图像尺寸的过程,可以包括放大或缩小。以下是一个缩放图像的函数:

    def scale_image(image, scale_factor):
        return cv2.resize(image, None, fx=scale_factor, fy=scale_factor)
    

    1.3 平移(Translation)

    平移是将图像在水平或垂直方向上移动。以下是一个平移图像的函数:

    def translate_image(image, x, y):
        M = np.float32([[1, 0, x], [0, 1, y]])
        translated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
        return translated
    

    1.4 剪切(Shearing)

    剪切是对图像施加一个剪切变换,使其沿某个方向倾斜。以下是一个剪切图像的函数:

    def shear_image(image, shear_factor):
        (h, w) = image.shape[:2]
        M = np.float32([[1, shear_factor, 0], [0, 1, 0]])
        sheared = cv2.warpAffine(image, M, (w, h))
        return sheared
    

    2. 翻转与镜像

    翻转和镜像操作是对图像进行对称变换,使得图像在水平或垂直方向上翻转。

    2.1 水平翻转(Horizontal Flip)

    flipped_horizontally = cv2.flip(image, 1)
    

    2.2 垂直翻转(Vertical Flip)

    flipped_vertically = cv2.flip(image, 0)
    

    3. 颜色调整

    颜色调整包括亮度、对比度、饱和度和色调的变化,可以模拟不同的拍摄条件。

    3.1 亮度调整(Brightness Adjustment)

    def adjust_brightness(image, value):
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        hsv = np.array(hsv, dtype=np.float64)
        hsv[:, :, 2] = hsv[:, :, 2] * (value / 100.0)
        hsv[:, :, 2][hsv[:, :, 2] > 255] = 255
        hsv = np.array(hsv, dtype=np.uint8)
        brightened = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
        return brightened
    

    3.2 对比度调整(Contrast Adjustment)

    def adjust_contrast(image, alpha):
        adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=0)
        return adjusted
    

    3.3 饱和度调整(Saturation Adjustment)

    def adjust_saturation(image, value):
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        hsv = np.array(hsv, dtype=np.float64)
        hsv[:, :, 1] = hsv[:, :, 1] * (value / 100.0)
        hsv[:, :, 1][hsv[:, :, 1] > 255] = 255
        hsv = np.array(hsv, dtype=np.uint8)
        saturated = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
        return saturated
    

    3.4 色调调整(Hue Adjustment)

    def adjust_hue(image, hue_shift):
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        hsv[:, :, 0] = (hsv[:, :, 0] + hue_shift) % 180
        hue_adjusted = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
        return hue_adjusted
    

    4. 噪声与模糊

    4.1 添加噪声(Noise Addition)

    在图像中添加噪声可以增强模型对噪声的鲁棒性。以下是添加高斯噪声和椒盐噪声的实现:

    def add_gaussian_noise(image, mean=0, std=25):
        gaussian_noise = np.random.normal(mean, std, image.shape).astype(np.uint8)
        noisy_image = cv2.add(image, gaussian_noise)
        return noisy_image
    
    def add_salt_pepper_noise(image, salt_prob, pepper_prob):
        noisy_image = np.copy(image)
        num_salt = np.ceil(salt_prob * image.size)
        num_pepper = np.ceil(pepper_prob * image.size)
    
        coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
        noisy_image[coords[0], coords[1], :] = 255
    
        coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
        noisy_image[coords[0], coords[1], :] = 0
    
        return noisy_image
    

    4.2 模糊(Blurring)

    模糊可以减少图像细节,有助于防止模型过拟合。

    blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
    

    5. 裁剪与填充

    5.1 随机裁剪(Random Cropping)

    随机裁剪可以生成图像的不同视图。

    def random_crop(image, crop_size):
        h, w = image.shape[:2]
        start_x = np.random.randint(0, w - crop_size[0])
        start_y = np.random.randint(0, h - crop_size[1])
        cropped_image = image[start_y:start_y+crop_size[1], start_x:start_x+crop_size[0]]
        return cropped_image
    

    5.2 填充(Padding)

    填充是在图像周围添加边框,使图像保持原始尺寸或改变其长宽比。

    def pad_image(image, pad_size, pad_value=0):
        padded_image = cv2.copyMakeBorder(image, pad_size, pad_size, pad_size, pad_size, cv2.BORDER_CONSTANT, value=pad_value)
        return padded_image
    

    6. 自适应增强技术

    6.1 随机擦除(Random Erasing)

    随机擦除是将图像中的部分区域替换为随机像素值。

    def random_erasing(image, erasing_prob=0.5, area_ratio_range=(0.02, 0.4), min_aspect_ratio=0.3):
        if np.random.rand() > erasing_prob:
            return image
    
        h, w = image.shape[:2]
        area = h * w
    
        for _ in range(100):
            target_area = np.random.uniform(area_ratio_range[0], area_ratio_range[1]) * area
            aspect_ratio = np.random.uniform(min_aspect_ratio, 1/min_aspect_ratio)
    
            erase_h = int(round(np.sqrt(target_area * aspect_ratio)))
            erase_w = int(round(np.sqrt(target_area / aspect_ratio)))
    
            if erase_w < w and erase_h < h:
                x = np.random.randint(0, w - erase_w)
                y = np.random.randint(0, h - erase_h)
                image[y:y + erase_h, x:x + erase_w] = np.random.randint(0, 256, (erase_h, erase_w, 3))
                return image
        return image
    

    7. 高级技术

    7.1 Mixup

    Mixup是一种将两张图像及其标签混合的技术,有助于生成新的样本并平滑决策边界。

    def mixup(image1, image2, alpha=0.2):
        lam = np.random.beta(alpha, alpha)
        mixed_image = lam * image1 + (1 - lam) * image2
        mixed_image = mixed_image.astype(np.uint8)
        return mixed_image
    

    7.2 CutMix

    CutMix是将一张图像的一部分与另一张图像混合的技术。

    def cutmix(image1, image2
    
    , alpha=0.2):
        lam = np.random.beta(alpha, alpha)
        h, w = image1.shape[:2]
        cut_rat = np.sqrt(1. - lam)
        cut_w = np.int(w * cut_rat)
        cut_h = np.int(h * cut_rat)
    
        # Uniform
        cx = np.random.randint(w)
        cy = np.random.randint(h)
    
        bbx1 = np.clip(cx - cut_w // 2, 0, w)
        bby1 = np.clip(cy - cut_h // 2, 0, h)
        bbx2 = np.clip(cx + cut_w // 2, 0, w)
        bby2 = np.clip(cy + cut_h // 2, 0, h)
    
        image1[bby1:bby2, bbx1:bbx2] = image2[bby1:bby2, bbx1:bbx2]
        return image1
    

    综合应用

    为了实现强大的数据增强效果,我们可以将上述多种技术组合起来使用。例如,以下代码将多个图像增强操作组合在一起:

    def augment_image(image):
        if np.random.rand() > 0.5:
            image = rotate_image(image, np.random.uniform(-15, 15))
        if np.random.rand() > 0.5:
            image = scale_image(image, np.random.uniform(0.8, 1.2))
        if np.random.rand() > 0.5:
            image = adjust_brightness(image, np.random.uniform(50, 150))
        if np.random.rand() > 0.5:
            image = add_gaussian_noise(image)
    
        return image
    
    augmented_image = augment_image(image)
    

    总结

    图像增强是提高深度学习模型性能的重要技术。通过使用OpenCV,我们可以轻松实现各种增强技术。本文介绍了基本几何变换、颜色调整、噪声与模糊、自适应增强技术以及高级技术,如Mixup和CutMix。读者可以根据实际需求,自由组合这些增强技术,以生成多样化的训练样本,提升模型的泛化能力。希望这篇博客对你理解和应用图像增强有所帮助。

  • 相关阅读:
    GoLang连接mysql数据库
    [答疑]校长出轨主任流程的业务建模
    【数据结构】——常见排序
    indiegogo/kickstarter海外众筹是什么
    java计算机毕业设计中小企业的在线工作日志管理系统源程序+mysql+系统+lw文档+远程调试
    初阶数据结构学习记录——여덟 二叉树
    java毕业设计疫情期间中小学生作业线上管理系统设计与实现Mybatis+系统+数据库+调试部署
    python之股票财务分析
    【C++ 学习 ㊳】- 详解 C++ 强制类型转换
    MySQl学习笔记-6.数据库的备份
  • 原文地址:https://blog.csdn.net/weixin_74075792/article/details/141001753