4-CNN-demo-0401-数据增强OpenCV

本文深入探讨了使用OpenCV进行图像增强的各种技术,包括亮度调节、平移、裁剪与缩放、翻转、旋转及颜色空间转换等操作,旨在提升图像处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False

def brightness_images(image):
    """
    随机调节图片亮度
    :param image:
    :return:
    """
    # 颜色通道转换   BGR ----> HSV(Hue 色调, Saturation 饱和度  V  亮度) H=aB+bG+cR
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    image1 = np.array(hsv, dtype=np.float64)
    random_bright = 0.5 + np.random.uniform()  # 随机调亮 或者调暗的随机数生成
    print(random_bright)
    image1[:, :, 2] = image[:, :, 2] * random_bright

    # 对于大于255的 进行裁剪。
    image1[:, :, 2][image1[:, :, 2] > 255] = 255
    image1 = np.array(image1, dtype=np.uint8)
    rgb = cv2.cvtColor(image1, cv2.COLOR_HSV2RGB)
    return rgb

def trans_image(image, hori_range, vertical_range):
    """
    实现平移 (线性变换)
    :param image:
    :param hori_range:
    :param vertical_range:
    :return:
    """
    rows, cols, channels = image.shape
    # 定义平移量 tr_x 代表水平平移的量, tr_y 代表垂直平移的量
    tr_x = hori_range*np.random.uniform() - hori_range/2
    tr_y = vertical_range*np.random.uniform() - vertical_range/2

    # 构造仿射关系矩阵。
    trans_matrix = np.float32([[1, 0, tr_x], [0, 1, tr_y]])
    img_trans = cv2.warpAffine(image, trans_matrix, (cols, rows))
    image1 = np.array(img_trans, dtype=np.uint8)
    return image1


def crop_img_and_resize(image):
    shape = image.shape
    image1 = image[100:shape[0], 0:shape[1]]

    # 需要重新resize 缩放
    new_col = 224
    new_row = 224
    image1 = cv2.resize(image1, (new_col, new_row), interpolation=cv2.INTER_AREA)
    return image1

def flip_img(image, flip_mode):
    """
    随机翻转
    :param image:
    :param flip_mode:
    :return:
    """
    randomint_flip = np.random.randint(2)
    if randomint_flip==0:
        # flip_mode 0代表沿着x轴 翻转,  正数代表沿着y轴翻转, 负数沿着2根都翻转。
        image = cv2.flip(image, flip_mode)
    return image

def rotation_img(image_src):
    """
    随机旋转
    :param image_src:
    :return:
    """
    rows, cols = image_src.shape[:2]
    # 定义一个随机旋转的随机数
    rotation_randomint = np.random.randint(low=180)
    print(rotation_randomint)
    # 定义一个旋转映射的矩阵。
    rotate_M = cv2.getRotationMatrix2D((cols/2, rows/2), rotation_randomint, 1.0)
    rotated_img = cv2.warpAffine(image_src, rotate_M, (cols, rows), borderValue=[225, 225, 225])
    return rotated_img


def random_rotated_img():
    img_origin = './images/4.jpg'
    img = cv2.imread(img_origin)
    rotated_img = rotation_img(img)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片')

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(rotated_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机旋转以后的')
    plt.show()


def random_flip_img():
    """
    执行随机翻转
    :return:
    """
    img_origin = './images/4.jpg'
    img = cv2.imread(img_origin)
    flipped_img = flip_img(img, flip_mode=-1)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片')

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(flipped_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机翻转以后的')
    plt.show()

def scale_img():
    img_origin = './images/2.jpg'
    img = cv2.imread(img_origin)
    resized_img = crop_img_and_resize(img)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片')

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(resized_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机裁剪并缩放以后的')
    plt.show()


def vertical_hrizontal_shift():
    """
    随机水平或者垂直移动图片
    :return:
    """
    img_origin = './images/1.jpg'
    img = cv2.imread(img_origin)
    shifted_img = trans_image(img, hori_range=500, vertical_range=600)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片')

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(shifted_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机平移以后的')
    plt.show()


def random_bright_img():
    """
    执行随机调整图片亮度
    :return:
    """
    img_origin = './images/3.jpg'
    img = cv2.imread(img_origin)

    brighted_img = brightness_images(img)

    # 定义一个画板
    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)

    # 121的意思是: 整个画板分为 1行2列, a位于第一个位置。
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片')

    b = fig.add_subplot(122)
    b.imshow(brighted_img)
    b.set_title('调节亮度以后的')
    plt.show()


def img_color_change():
    img_origin = './images/3.jpg'
    img = cv2.imread(img_origin)  # cv2默认读入进来的格式 是 BGR

    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)

    # 定义一个画板
    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)

    # 121的意思是: 整个画板分为 1行2列, a位于第一个位置。
    a = fig.add_subplot(231)
    a.imshow(img)
    a.set_title('原始图片')

    b = fig.add_subplot(232)
    b.imshow(rgb)
    b.set_title('rgb')

    c = fig.add_subplot(233)
    c.imshow(hsv)
    c.set_title('hsv')

    d = fig.add_subplot(234)
    d.imshow(gray, cmap='Greys')
    d.set_title('gray')

    e = fig.add_subplot(235)
    e.imshow(hls)
    e.set_title('hls')

    plt.show()



if __name__ == '__main__':
    img_color_change()
    scale_img()
    for _ in range(3):
        random_bright_img()
        vertical_hrizontal_shift()
        random_flip_img()
        random_rotated_img()

D:\Anaconda\python.exe D:/AI20/HJZ/04-深度学习/3-CNN/20191207/04_数据增强opencv.py
1.156051257135442
57
0.8624181451842686
41
1.408784374768897
154

Process finished with exit code 0

1
2
3
4
5
6
7
8

经过双系统测试,ubuntu16.04上中文乱码,
修改如下:
显示标题里加上了中文字体simhei-windows.ttf

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# # 设置字符集,防止中文乱码
# mpl.rcParams['font.sans-serif'] = [u'simHei']
# mpl.rcParams['axes.unicode_minus'] = False
zhfont = mpl.font_manager.FontProperties(
        fname=r'/home/hjz/PycharmProjects/lianxi/11_tensorflow1.4.0/datas/fashion_mnist/SimHei-windows.ttf')

# 随机调节图片亮度
def brightness_images(image):
    """
    随机调节图片亮度
    :param image:
    :return:
    """
    # 颜色通道转换   BGR ----> HSV(Hue 色调, Saturation 饱和度  V  亮度) H=aB+bG+cR
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    image1 = np.array(hsv, dtype=np.float64)
    random_bright = 0.5 + np.random.uniform()  # 随机调亮 或者调暗的随机数生成
    # print(random_bright)
    image1[:, :, 2] = image[:, :, 2] * random_bright

    # 对于大于255的 进行裁剪。
    image1[:, :, 2][image1[:, :, 2] > 255] = 255
    image1 = np.array(image1, dtype=np.uint8)
    rgb = cv2.cvtColor(image1, cv2.COLOR_HSV2RGB)
    return rgb

# 实现平移 (线性变换)
def trans_image(image, hori_range, vertical_range):
    """
    实现平移 (线性变换)
    :param image:
    :param hori_range:
    :param vertical_range:
    :return:
    """
    rows, cols, channels = image.shape
    # 定义平移量 tr_x 代表水平平移的量, tr_y 代表垂直平移的量
    tr_x = hori_range*np.random.uniform() - hori_range/2
    tr_y = vertical_range*np.random.uniform() - vertical_range/2

    # 构造仿射关系矩阵。
    trans_matrix = np.float32([[1, 0, tr_x], [0, 1, tr_y]])
    img_trans = cv2.warpAffine(image, trans_matrix, (cols, rows))
    image1 = np.array(img_trans, dtype=np.uint8)
    return image1

#裁剪和缩放
def crop_img_and_resize(image):
    shape = image.shape
    image1 = image[100:shape[0], 0:shape[1]]

    # 需要重新resize 缩放
    new_col = 224
    new_row = 224
    image1 = cv2.resize(image1, (new_col, new_row), interpolation=cv2.INTER_AREA)#使用像素区域关系进行重采样
    return image1

# 随机翻转
def flip_img(image, flip_mode):
    """
    随机翻转
    :param image:
    :param flip_mode:
    :return:
    """
    randomint_flip = np.random.randint(2)
    if randomint_flip==0:
        # flip_mode 0代表沿着x轴 翻转,  正数代表沿着y轴翻转, 负数沿着2根都翻转。
        image = cv2.flip(image, flip_mode)
    return image

# 随机旋转
def rotation_img(image_src):
    """
    随机旋转
    :param image_src:
    :return:
    """
    rows, cols = image_src.shape[:2]
    # 定义一个随机旋转的随机数
    rotation_randomint = np.random.randint(low=180)
    print(rotation_randomint)
    # 定义一个旋转映射的矩阵。
    rotate_M = cv2.getRotationMatrix2D((cols/2, rows/2), rotation_randomint, 1.0)
    rotated_img = cv2.warpAffine(image_src, rotate_M, (cols, rows), borderValue=[225, 225, 225])
    return rotated_img

# 随机旋转-可视化
def random_rotated_img():
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/liuyifei.jpeg'
    img = cv2.imread(img_origin)
    rotated_img = rotation_img(img)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片',fontproperties=zhfont)

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(rotated_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机旋转以后的',fontproperties=zhfont)
    plt.show()

# 随机翻转-可视化
def random_flip_img():
    """
    执行随机翻转
    :return:
    """
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/yangchaoyue.jpeg'
    img = cv2.imread(img_origin)
    flipped_img = flip_img(img, flip_mode=-1)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片',fontproperties=zhfont)

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(flipped_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机翻转以后的',fontproperties=zhfont)
    plt.show()

# 随机裁剪并缩放-可视化
def scale_img():
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/yangmi.jpg'
    img = cv2.imread(img_origin)
    resized_img = crop_img_and_resize(img)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片',fontproperties=zhfont)

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(resized_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机裁剪并缩放以后的',fontproperties=zhfont)
    plt.show()

# 随机水平或者垂直移动-可视化
def vertical_hrizontal_shift():
    """
    随机水平或者垂直移动图片
    :return:
    """
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/zhaoliying3.jpg'
    img = cv2.imread(img_origin)
    shifted_img = trans_image(img, hori_range=500, vertical_range=600)

    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片',fontproperties=zhfont)

    b = fig.add_subplot(122)
    b.imshow(cv2.cvtColor(shifted_img, cv2.COLOR_BGR2RGB))
    b.set_title('随机平移以后的',fontproperties=zhfont)
    plt.show()

# 随机调整图片亮度-可视化
def random_bright_img():
    """
    执行随机调整图片亮度
    :return:
    """
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/data/paonan.jpg'
    img = cv2.imread(img_origin)

    brighted_img = brightness_images(img)

    # 定义一个画板
    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)

    # 121的意思是: 整个画板分为 1行2列, a位于第一个位置。
    a = fig.add_subplot(121)
    a.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    a.set_title('原始图片',fontproperties=zhfont)

    b = fig.add_subplot(122)
    b.imshow(brighted_img)
    b.set_title('调节亮度以后的',fontproperties=zhfont)
    plt.show()

# 图像颜色变化-可视化
def img_color_change():
    img_origin = '/home/hjz/PycharmProjects/lianxi/01_FaceDetection/data/zhaoliying5.jpg'
    img = cv2.imread(img_origin)  # cv2默认读入进来的格式 是 BGR

    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)

    # 定义一个画板
    fig = plt.figure(figsize=(8, 6))  # 代表宽 和高 (单位:英寸)

    # 121的意思是: 整个画板分为 1行2列, a位于第一个位置。
    a = fig.add_subplot(231)
    a.imshow(img)

    a.set_title('图片原始',fontproperties=zhfont)

    b = fig.add_subplot(232)
    b.imshow(rgb)
    b.set_title('rgb')

    c = fig.add_subplot(233)
    c.imshow(hsv)
    c.set_title('hsv')

    d = fig.add_subplot(234)
    d.imshow(gray, cmap='Greys')
    d.set_title('gray')

    e = fig.add_subplot(235)
    e.imshow(hls)
    e.set_title('hls')

    plt.show()



if __name__ == '__main__':
    img_color_change()
    scale_img()
    for _ in range(3):
        random_bright_img()
        vertical_hrizontal_shift()
        random_flip_img()
        random_rotated_img()


在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值