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

图像增强方法汇总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-255adjusted_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.mzph.cn/diannao/40227.shtml

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

相关文章

UserWarning: IPython History requires SQLite, your history will not be saved

UserWarning: IPython History requires SQLite, your history will not be saved 很久未打开pycharm,控制台出现爆红 解决方法: 重启pycharm,就好啦!!!我猜测可能是上次pycharm没有关闭就电脑关机&…

《企业实战分享 · 内存溢出分析》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

用PyQt5打造炫酷界面:深入解析pyqt5-custom-widgets

在PyQt5中,使用自定义小部件可以为应用程序增添更多实用性和时尚感。pyqt5-custom-widgets是一个开源项目,提供了一系列有用且时尚的自定义小部件,如开关按钮、动画按钮等。本文将详细介绍pyqt5-custom-widgets的安装和使用方法。 安装 可以…

权限维持Linux---监控功能Strace后门命令自定义Alias后门

免责声明:本文仅做技术交流与学习... 目录 监控功能Strace后门 1、记录 sshd 明文 监控 筛选查看 2、记录sshd私钥 命令自定义Alias后门 1、简单粗鲁实现反弹: 靶机替换命令 攻击机监听上线 2.升级(让命令正常) 将反弹命令进行base64编码 替换alias命令 …

【Linux】--help,man page , info page

我们知道Linux有很多的命令,那LInux要不要背命令? 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢? 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

java版企业工程管理系统源码:全方位的项目管理解决方案

工程管理系统是一款专注于建设工程项目全生命周期管理的软件。它覆盖了项目从策划、设计、施工到竣工的每一个阶段,提供全方位的管理功能。系统采用模块化设计,包括系统管理、系统设置、项目管理、合同管理、预警管理、竣工管理、质量管理、统计报表和工…

6月30日功能测试Day10

3.4.4拼团购测试点 功能位置:营销-----拼团购 后台优惠促销列表管理可以添加拼团,查看拼团活动,启动活动,编辑活动,删除活动。 可以查看拼团活动中已下单的订单以状态 需求分析 功能和添加拼团 商品拼团活动页 3…

python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟,就连QQ的windows客户端都用web技术来开发,所以在未来,web技术来开发windows桌面软件也会越来越多,所以在此发展驱动之下,将最近流程的python与web技术相结合,使用vue3和element-plus…

图像增强 目标检测 仿射变换 图像处理 扭曲图像

1.背景 在目标检测中,需要进行图像增强。这里的代码模拟了旋转、扭曲图像的功能,并且在扭曲的时候,能够同时把标注的结果也进行扭曲。 这里忽略了读取xml的过程,假设图像IMG存在对应的标注框,且坐标为左上、右下两个…

[C++初阶]vector的初步理解

一、标准库中的vector类 1.vector的介绍 1. vector是表示可变大小数组的序列容器 , 和数组一样,vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大…

Java学习高级一

修饰符 static 类变量的应用场景 成员方法的分类 成员变量的执行原理 成员方法的执行原理 Java之 main 方法 类方法的常见应用场景 代码块 设计模式 单例设计模式 饿汉式单例设计模式 懒汉式单例设计模式 继承 权限修饰符

小红书 达芬奇:生活问答 AI 机器人

小红书去年 9 月开始内测的生活问答 AI 机器人:达芬奇,现在可以在小红书 APP 上用了 得益于小红书平台的特性,该助手擅长吃、住、宠、喝、学等等各类生活知识,目前还在搞活动,写评测笔记最高得 666 元

为什么不能在foreach中删除元素

文章目录 快速失败机制(fail-fast)for-each删除元素为什么报错原因分析逻辑分析 如何正确的删除元素remove 后 breakfor 循环使用 Iterator 总结 快速失败机制(fail-fast) In systems design, a fail-fast system is one which i…

网络基础:EIGRP

EIGRP(Enhanced Interior Gateway Routing Protocol)是由思科开发的一种高级距离矢量路由协议,结合了距离矢量和链路状态路由协议的优点;EIGRP具有快速收敛、高效带宽利用、负载均衡等特点,适用于各种规模的网络。EIGR…

python sklearn机械学习-数据预处理

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

【设计模式】策略模式(定义 | 特点 | Demo入门讲解)

文章目录 定义策略模式的结构 QuickStart | DemoStep1 | 策略接口Step2 | 策略实现Step3 | 上下文服务类Step4 | 客户端 策略模式的特点优点缺点 定义 策略模式Strategy是一种行为模式,它能定义一系列算法,并将每种算法分别放入到独立的类中&#xff0c…

负载均衡类型和算法解析

假如你正在设计和开发一个分布式服务系统,系统中存在一批能够独立运行的服务,而在部署上也采用了集群模式以防止出现单点故障。所谓集群,就是指将多个服务实例集中在一起,对外提供同一业务功能,也就是任意请求都可以由…

吉利银河L6 AQS空气质量监控系统

结论 顶配才有AQS 开启空调且auto模式 则默认开启AQS 无法关闭AQS AQS的作用 银河L6 AQS触发 和 图标 AQS官方配置参数 官方文档 吉利用户手册

开源即正义,3D软件Blender设计指南

在当今数字化时代,开源软件的崛起不仅代表着技术的发展,更象征着一种信息自由和技术民主的理念。其本质是集众人之智,共同去完善一个软件,最终使双方互惠共赢。具体来说,开源的价值,在于打破资源垄断&#…

苹果AI的国产大模型之争,没有悬念

文 | 智能相对论 作者 | 陈泊丞 苹果终于公布了最新的AI进程。 一个月前,正如此前预期的那样,人工智能是今年 WWDC 发布会的焦点。全程105分钟的主题演讲,就有40多分钟用于介绍苹果的AI成果。 苹果似乎还有意玩了一把“谐音梗”&#xff…