图像增强方法汇总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-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.mfbz.cn/a/769389.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac本地部署大模型-单机运行

前些天在一台linux服务器(8核,32G内存,无显卡)使用ollama运行阿里通义千问Qwen1.5和Qwen2.0低参数版本大模型,Qwen2-1.5B可以运行,但是推理速度有些慢。 一直还没有尝试在macbook上运行测试大模型&#xf…

bug,属性注入时为null

因为在使用拦截器时使用的是new的这个类放容器的 解决方法: 使用有参构造器,在new对象时传入值

SpringBoot 通过Knife4j集成API文档 在线调试

介绍 Knife4j 是一款基于 Swagger 构建的增强型 API 文档生成工具&#xff0c;它提供了更多的定制化功能和界面优化&#xff0c;使得生成的 API 文档更加美观和易用。它可以帮助开发者快速生成和管理 API 文档&#xff0c;支持在线调试和交互。 依赖 <!--knife4j--> &…

使用Python3和Selenium打造百度图片爬虫

开篇 本文的目的在于实现一个用来爬取百度图片的爬虫程序,因该网站不需要登录&#xff0c;所以相对来说较为简单。下面的爬虫程序中我写了比较多的注释&#xff0c;以便于您的理解。 准备 请确保电脑上已经安装了与chrome浏览器版本匹配的chromeDriver&#xff0c;且电脑中已经…

【C++】解决 C++ 语言报错:Dangling Pointer

文章目录 引言 悬挂指针&#xff08;Dangling Pointer&#xff09;是 C 编程中常见且危险的错误之一。当程序试图访问指向已释放内存的指针时&#xff0c;就会发生悬挂指针错误。这种错误不仅会导致程序崩溃&#xff0c;还可能引发不可预测的行为和安全漏洞。本文将深入探讨悬…

C++ | Leetcode C++题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:string shortestPalindrome(string s) {int n s.size();vector<int> fail(n, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s[j 1] ! s[i]) {j fail[j];}if (s[j 1] …

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

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

Object 类中的公共方法详解

Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#xff0c;Object…

Redis的八种数据类型介绍

Redis 是一个高性能的键值存储&#xff0c;它支持多种丰富的数据类型。每种数据类型都有其特定的用途和底层实现。下面我将介绍 Redis 支持的主要数据类型及其背后的数据结构。 本人这里还有几篇详细的Redis用法文章&#xff0c;可以用来进阶康康&#xff01; 1. 字符串 (Stri…

c++习题08-计算星期几

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 首先&#xff0c;需要注意到的是3^2000这个数值很大&#xff0c;已经远远超过了long long 数据类型能够表示的范围&#xff0c;如果想要使用指定的数据类型来保存…

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从&#xff08;master-slave&#xff09;复制&#…

【WebGIS干货分享】Webgis 面试题-浙江中海达

1、Cesium 中有几种拾取坐标的方式&#xff0c;分别介绍 Cesium 是一个用于创建 3D 地球和地理空间应用的 JavaScript 库。在 Cesium 中&#xff0c;你可以使用不同的方式来拾取坐标&#xff0c;以便与地球或地图上的对象进行交 互。以下是 Cesium 中几种常见的拾取坐标的方式…

重载与覆写介绍

方法重载&#xff08;Overloading&#xff09; 方法重载是指在同一个类中定义多个方法&#xff0c;它们具有相同的名字但参数列表不同。这是通过改变参数的数量、类型的种类或次序来实现的。例如&#xff1a; public class OverloadingExample { // 方法重载可以通过参数的数…

# Sharding-JDBC从入门到精通(8)- 综合案例(一)数据库设计搭建与分片策略配置

Sharding-JDBC从入门到精通&#xff08;8&#xff09;- 综合案例&#xff08;一&#xff09;数据库设计搭建与分片策略配置 一、Sharding-JDBC 综合案例-数据库设计 1、案例 需求描述&#xff1a;本案例实现功能如下: 1、添加商品2、商品分页查询3、商品统计 2、数据库设计…

qtreewidget 美化,htmlcss和qss 不是一个概念!已解决

这种样式的美化&#xff0c; 能气死个人&#xff0c;css 一个单词搞定&#xff0c;非要 在qss中。多少个单词不知道了。 m_tree_widget->setStyleSheet("QTreeView{background:transparent; selection-background-color:transparent;}""QTreeView::branch{b…

求函数最小值-torch版

目标&#xff1a;torch实现下面链接中的梯度下降法 先计算 的导函数 &#xff0c;然后计算导函数 在处的梯度 (导数) 让 沿着 梯度的负方向移动&#xff0c; 自变量 的更新过程如下 torch代码实现如下 import torchx torch.tensor([7.5],requires_gradTrue) # print(x.gr…

<电力行业> - 《第16课:电力领域(二)》

3 制造 3.1 电气制造厂 发电厂发电需要发电机&#xff0c;变电站升压降压需要变压器&#xff0c;输电线路输送电能需要电缆&#xff0c;这些主要电气设备的制造商&#xff0c;就是电力设备厂家。 电气设备制造是电力领域市场最基础也是最开放的领域&#xff0c;电力行业内最…

qt 滚动区域简单实验

1.概要 有些时候&#xff0c;想用一个有限的区域显示更多的内容&#xff0c;且内容不固定用滚动区域控件是一个不错的选择&#xff0c;我今天就用一个图片简单的实验一下。 2.代码&#xff08;关键代码&#xff09; #include "widget.h" #include "ui_widget…

法国工程师IMT联盟 密码学及其应用 2023年期末考试题

1 在 Unix 下的安全性 (30 分钟) 1.1 问题 1 1.1.1 问题 我们注意constat到通过 SMTP 服务器发送“假”电子邮件&#xff08;垃圾邮件&#xff09;相对容易。越来越常见的做法是在 SMTP 连接之上部署dployer TLS 协议protocole&#xff08;即 SMTPS&#xff09;。这解决了垃圾…

行为驱动开发(BDD):提升软件质量的新方法

目录 前言1 行为驱动开发的概述1.1 BDD 的起源和发展1.2 BDD 的核心概念 2 BDD 的优势2.1 提高测试的可读性和理解性2.2 增强团队协作2.3 提高软件质量 3 BDD 的实施方法3.1 定义用户故事3.2 编写行为测试3.3 开发和验证3.4 持续集成和反馈 4 BDD 工具和实践4.1 常用的 BDD 工具…
最新文章