图像增强方法汇总OpenCV+python实现【第一部分:常用图像增强方法】

news2024/12/26 16:06:18

图像增强方法汇总OpenCV+python实现【第一部分】

  • 前言
    • 常用的图像增强方法
      • 1. 旋转(Rotation):
      • 2. 平移(Translation):
      • 3. 缩放(Scaling):
      • 4. 剪切变换(Shear Transform):
      • 5. 翻转(Flipping):
      • 6. 亮度调整(Brightness Adjustment):
      • 7. 对比度调整(Contrast Adjustment):
      • 8. 添加噪声(Adding Noise):
      • 9. 颜色抖动(Color Jittering):
      • 10. 随机擦除(Random Erasing)

前言

图像增强是指通过各种技术手段改善图像的视觉效果,使其更适合特定的应用场景。以下是一些常见的图像增强方法。

注意:本文从广义的角度讲图像增强方法,这些图像增强方法不一定都适用于CV中AI模型训练前的图像处理

常用的图像增强方法

在CV模型的训练过程中,图像增强(Image Augmentation)是一个非常重要的技术,可以有效地增加训练数据的多样性,防止过拟合,并提高模型的泛化能力。以下是一些常用的图像增强方法,它们在训练CNN模型时非常有用:

1. 旋转(Rotation):

  • 随机旋转图像一定角度。

# 图像路径,替换成你的图片路径
 image_path = '1.jpg'

 # 载入图像
 image = cv2.imread(image_path)

 # 获取图像尺寸
 (h, w) = image.shape[:2]

 # 设置旋转的中心为图像中心
 center = (w / 2, h / 2)

 # 生成一个-90到90之间的随机旋转角度
 angle = np.random.uniform(-90, 90)

 # 获取旋转矩阵,其中1.0表示图像旋转后不改变大小
 rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

 # 执行旋转操作
 rotated_image = cv2.warpAffine(image, rotation_matrix, (w, h))

 # 显示原图和旋转后的图像
 cv2.imshow('Original Image', image)
 cv2.imshow('Rotated Image', rotated_image)

 # 按任意键退出
 cv2.waitKey(0)
 cv2.destroyAllWindows()

旋转效果如下:
在这里插入图片描述


2. 平移(Translation):

  • 随机平移图像在水平或垂直方向上的位置。

# 获取图像的高和宽
height, width = image.shape[:2]

# 随机生成平移量(注意:这里需要确保平移量不会使图像超出边界)
tx = np.random.randint(-100, 100)  # 水平方向上的平移量,单位:像素
ty = np.random.randint(-100, 100)  # 垂直方向上的平移量,单位:像素

# 确保平移后的图像不会超出原始图像的边界
tx = max(min(tx, width-1), 0)
ty = max(min(ty, height-1), 0)

# 创建仿射变换矩阵
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])

# 应用仿射变换
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))

# 显示或保存平移后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Translated Image', translated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

平移效果如下:
在这里插入图片描述


3. 缩放(Scaling):

  • 随机缩放图像大小。

def random_scale_image(image, scale_range=(0.5, 1.5)):
 """
随机缩放图像的大小。

:param image: 要缩放的图像,应为numpy数组形式
:param scale_range: 缩放比例的范围,默认(0.5, 1.5),即缩放后的大小在原始大小的50%到150%之间
:return: 缩放后的图像
"""
 # 生成一个随机的缩放比例
 scale = np.random.uniform(scale_range[0], scale_range[1])
 
 # 获取原始图像的高度和宽度
 height, width = image.shape[:2]
 
 # 计算缩放后的新高度和宽度
 new_height = int(height * scale)
 new_width = int(width * scale)
 
 # 使用cv2.resize()进行缩放
 scaled_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
 
 return scaled_image

# 随机缩放图像
scaled_image = random_scale_image(image)

# 显示缩放后的图像(如果需要)
cv2.imshow('Original Image', image)
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

缩放效果:
在这里插入图片描述


4. 剪切变换(Shear Transform):

  • 随机剪切图像。


 import random

 # 步骤1:定义随机剪切参数
 # 注意:这里我们假设剪切的区域不能超出原始图像的范围
 shear_height = random.randint(1, height // 2)  # 随机剪切高度(这里设定为图像高度的一半以下)
 shear_width = random.randint(1, width // 2)   # 随机剪切宽度(这里设定为图像宽度的一半以下)
 start_y = random.randint(0, height - shear_height)
 start_x = random.randint(0, width - shear_width)

 # 步骤2:剪切图像
 sheared_image = image[start_y:start_y+shear_height, start_x:start_x+shear_width]

 # 步骤3:显示或保存剪切后的图像
 cv2.imshow('Original Image', image)
 cv2.imshow('Sheared Image', sheared_image)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

效果
在这里插入图片描述


5. 翻转(Flipping):

  • 随机水平或垂直翻转图像。

 # 定义一个函数来随机翻转图像
 def random_flip(image):
     # 随机选择翻转模式
     flip_code = random.choice([0, 1])  # 0为垂直翻转,1为水平翻转
     # 使用cv2.flip函数进行翻转
     flipped_image = cv2.flip(image, flip_code)
     return flipped_image

 # 调用函数并显示翻转后的图像
 flipped_image = random_flip(image)
 
 cv2.imshow('Original Image', image)
 cv2.imshow('Flipped Image', flipped_image)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

在这里插入图片描述


6. 亮度调整(Brightness Adjustment):

  • 随机调整图像的亮度。


def adjust_brightness_randomly(image, alpha_range=(0.5, 1.5)):
 # 生成一个随机亮度调整因子
 alpha = random.uniform(alpha_range[0], alpha_range[1])

 # 亮度调整
 adjusted_image = cv2.convertScaleAbs(image, alpha=alpha, beta=0)

 return adjusted_image

# 随机调整亮度
adjusted_image = adjust_brightness_randomly(image)

# 显示或保存调整后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Adjusted Image', adjusted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()


效果
在这里插入图片描述


7. 对比度调整(Contrast Adjustment):

  • 随机调整图像的对比度。


def random_contrast(image, contrast_range=[0.5, 1.5]):
 # 获取图像的维度
 h, w, _ = image.shape
 
 # 随机选择对比度系数
 contrast_factor = np.random.uniform(contrast_range[0], contrast_range[1])
 
 # 创建一个空的浮点型图像来存储调整后的图像
 adjusted_image = np.zeros((h, w, 3), dtype=np.float32)
 
 # 对图像进行对比度调整
 for i in range(h):
     for j in range(w):
         # 将像素值归一化到0-1之间
         pixel = image[i, j] / 255.0
         # 调整对比度
         adjusted_pixel = np.clip(contrast_factor * (pixel - 0.5) + 0.5, 0, 1)
         # 将像素值转换回0-255
         adjusted_image[i, j] = adjusted_pixel * 255
 
 # 将浮点数图像转换为无符号整数
 adjusted_image = np.uint8(adjusted_image)
 
 return adjusted_image

# 随机调整图像的对比度
adjusted_image = random_contrast(image)

# 显示原始图像和调整后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Adjusted Image', adjusted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()


效果如下
在这里插入图片描述


8. 添加噪声(Adding Noise):

  • 随机向图像中添加噪声。
 # 将图像数据转换为浮点型以支持噪声添加
image_N = image.astype(np.float32)

# 定义高斯噪声的均值和标准差
mean = 0
stddev = 50.0  # 可以根据需要调整这个值来控制噪声的强度

# 生成高斯噪声
noise = np.random.normal(mean, stddev, image_N.shape)

# 将噪声添加到图像上
noisy_image = np.clip(image_N + noise, 0, 255).astype(np.uint8)

# 显示或保存带噪声的图像
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在这里插入图片描述


9. 颜色抖动(Color Jittering):

  • 随机改变图像的颜色属性,如色调、饱和度和亮度。
 def random_color_shift(image, hue_shift_range=18, sat_shift_range=30, val_shift_range=40):
    # 将BGR图像转换为HSV图像
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # 分解HSV图像的通道
    h, s, v = cv2.split(hsv)

    # 随机改变色调
    h = cv2.add(h, np.random.randint(-hue_shift_range, hue_shift_range+1))
    h = np.clip(h, 0, 179)  # 确保色调值在0-179之间

    # 随机改变饱和度
    s = cv2.add(s, np.random.randint(-sat_shift_range, sat_shift_range+1))
    s = np.clip(s, 0, 255)  # 确保饱和度值在0-255之间

    # 随机改变亮度
    v = cv2.add(v, np.random.randint(-val_shift_range, val_shift_range+1))
    v = np.clip(v, 0, 255)  # 确保亮度值在0-255之间

    # 合并HSV通道
    hsv_shifted = cv2.merge((h, s, v))

    # 将HSV图像转换回BGR图像
    image_shifted = cv2.cvtColor(hsv_shifted, cv2.COLOR_HSV2BGR)

    return image_shifted


# 随机改变颜色属性
shifted_image = random_color_shift(image)

# 显示或保存图像
cv2.imshow('Original Image', image)
cv2.imshow('Shifted Image', shifted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在这里插入图片描述


10. 随机擦除(Random Erasing)

  • 随机遮挡图像的一部分,以增强模型的鲁棒性。
def random_mask_image(image, min_mask_area=0.05, max_mask_area=0.2):
    image_c = image.copy()
    height, width = image_c.shape[:2]

    # 确定要遮挡的面积(基于图像尺寸的百分比)
    min_mask_width_height = int(min(width, height) * np.sqrt(min_mask_area))
    max_mask_width_height = int(min(width, height) * np.sqrt(max_mask_area))

    # 随机选择遮挡区域的左上角坐标和大小
    start_x = random.randint(0, width - max_mask_width_height)
    start_y = random.randint(0, height - max_mask_width_height)
    mask_width = random.randint(min_mask_width_height, max_mask_width_height)
    mask_height = random.randint(min_mask_width_height, max_mask_width_height)

    # 在图像上绘制遮挡矩形
    image_c[start_y:start_y+mask_height, start_x:start_x+mask_width, :] = 0  # 使用黑色(RGB值为0,0,0)进行遮挡

    return image_c

# 使用示例
masked_image = random_mask_image(image)

cv2.imshow('Original Image', image)
cv2.imshow('Masked Image', masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1892622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK(Java Development Kit):Java开发工具包 JRE:Java运行时环境开发工具:javac(编译工具)、java(运行…

电机的分类

1.按工作电源种类划分 2.按结构特点分类 3.按启动与运行方式分类 4.按转子结构分类 5.按用途分类 6.按运转速度分类 其他文章介绍了主流电机的原理和使用: 直流电机介绍-CSDN博客 步进电机(STM3228BYJ-48)-CSDN博客 待更新........

使用elasticsearch完成多语言搜索的三种方式

文档目标: 基于elasticsearch,实现不同语言搜索特定语言的文档数据;比如输入中文的内容,搜索中文文档数据,输入英文搜索英文文档数据,日韩文类似 方案概述: 方式一:不同的语言使用不…

Chirp信号生成(FPGA、基于cordic IP核)

一、Chirp生成模块介绍 采用Verilog 生成Chirp,实现输入使能电平,模块输出Chirp信号,Chirp信号频率范围,时间宽度,连续Chirp信号数量可配置。 二、模块例化方法示例 parameter FL d20_000 ; parameter FH…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码,还是只是需要将设备恢复到出厂设置,我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法,轻松重新控制您的 Rea…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中,构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出,还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

zabbix 配置企业微信告警

1、申请一个企业微信, 官网链接 2、群内申请一个机器人 下载电脑版企业微信,登录后,在要接收群消息的群里,点击右上角三个点,添加机器人后,保存机器人的webhook地址 上传应用logo,填写应用名称…

破解电脑卡顿难题,将数据优化,5分钟提升运行速度

当电脑变得缓慢且反应迟钝时,工作效率和娱乐体验都会大打折扣。而电脑卡顿是由于系统资源占用过多、磁盘空间不足等原因引起的。因此,我们经常需要寻找优化措施,提升电脑的运行速度。文章整理了4个优化方法,帮助你破解卡顿难题&am…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日,《碳排放权交易管理暂行条例》(以下简称《条例》)正式施行,作为我国应对气候变化领域的第一部专门法规,《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

将KVM虚拟机迁移为Virtualbox虚拟机

1、在KVM宿主机上把qcow2格式磁盘转成vdi格式 [rootkvm ~]# cd /kvm-data [rootkvm kvm-data]# qemu-img convert -f qcow2 wind30.qcow2 -O vdi wind30.vdi 注:把vdi转qcow2命令qemu-img convert -f vdi wind30.vdi -O qcow2 wind30.qcow2 2、把转换成功vdi磁盘…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6,内核ARM Cortex - M4,MCU+FPU,170MHz/213DMIPS,高达128KB Flash,32KB SRAM,其余的外设就不多介绍了,参照数据芯片数据手册 ​ CT117E-M4开发板资源:微控制器STM32G431RBT6、一路USB转串口、2.4寸TFT-LCD、4个功…

如何策划交互设计创意?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声,互动答疑环节往往反映了高校师生当前最普遍的运营困境,特此计老师在现场即兴答疑之外,会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

微信小程序一键打造专业简历

在这个竞争激烈的时代,一份出色的简历往往能成为你职业道路上的敲门砖。然而,对于大多数人来说,如何设计一份既美观又专业的简历却是一大难题。为了解决这一痛点,我们团队精心研发了一款微信小程序——“简历君”,它将…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分,它是Qt的一个核心类,用于处理不同数据类型之间的转换和传递。…

中伟视界:新疆维吾尔自治区矿山智能化案例揭秘——政策文件对AI算法模型的要求与平台功能详解

今天我们来剖析一下新疆维吾尔自治区矿山智能化的一个案例,重点讲解了一下新疆维吾尔自治区政策文件对矿山智能化的要求,矿山智能化案例针对政策文件要求做了哪些AI算法功能,其次讲讲新疆维吾尔自治区政策文件对平台及APP的要求和试点项目所完…

红酒与时尚秀场:品味潮流新风尚

在时尚与品味的交汇点上,红酒总是以其不同的方式,为每一次的时尚盛宴增添一抹诱人的色彩。当红酒遇上时尚秀场,不仅是一场视觉的盛宴,更是一次心灵的触动。今天,就让我们一起走进红酒与时尚秀场的世界,感受…

surfer做等值线图笔记

surfer等值线图及其白化 **grd文件的制作****白化的边界文件的制作****白化****绘图****逆转坐标轴** grd文件的制作 单击格网,选择x,y,z的数据,选择克里金插值方法,让后确定,保存grd文件 白化的边界文件的制作 surfer新建表&am…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库:CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句(如给用户li创建一个学生管理模式“S-T”)(需要先添加一个用户li) 3、在数据库ecommerce1中…

苏东坡传-读书笔记九

我们论到苏东坡,我们就不能避免“气”这个字。因为每个文学批评家综括苏东坡的个性,必用孟子所说的这个“气”字。 在《孟子》里,“气”是哲学的概念,类似柏格森所说的“生气勃勃”,是人格上的“元气”。使伟人和匹夫显…

jvm 03 JVM的运行时数据区域 ,(类常量池,运行时常量池,字符串常量池这个三个的区别),操作系统内存模型JMM和JVM的内存模型联系

方法区在jdk8后,改成元空间 JVM内存模型: JMM 主内存:本地方法区和堆 工作内存:私有的工作栈 其实一个JVM内存模型(主要就是运行时数据区域)一个Java进程的JMM,工作内存JVM中线程的内存区域…