【多模态/CV】图像数据增强数据分析和处理

news2025/1/21 1:00:31

note

  • 多模态大模型训练前,图片数据处理的常见操作:分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等

一、分辨率调整

from PIL import Image
def resize_image(original_image_path, save_image_path, reduction_percentage):
    # 打开图片文件
    img = Image.open(original_image_path)

    # 获取原始图片的尺寸
    original_width, original_height = img.size

    # 计算新的尺寸,根据减少的百分比
    new_width = int(original_width * (1 - reduction_percentage / 100.0))
    new_height = int(original_height * (1 - reduction_percentage / 100.0))

    # 使用LANCZOS滤镜来保持图片质量
    img_resized = img.resize((new_width, new_height), Image.LANCZOS)

    # 如果图像有透明通道,转换为RGB模式
    if img_resized.mode == 'RGBA':
        img_resized = img_resized.convert('RGB')

    # 保存缩小后的图片
    img_resized.save(save_image_path)

# 示例:
# 降低90%的分辨率
resize_image(one_image_path, resize_save_path, 90)

二、适当裁剪图片

# 从中心裁剪图片(高分辨率)
from PIL import Image
def crop_image_by_percentage(crop_percentage, input_path, output_path):
    # 打开图片文件
    img = Image.open(input_path)

    # 获取图片的原始尺寸
    original_width, original_height = img.size

    # 计算裁剪区域的宽度和高度,即原始尺寸的(100-crop_percentage)%
    crop_width = int(original_width * (1 - crop_percentage / 100))
    crop_height = int(original_height * (1 - crop_percentage / 100))

    # 计算裁剪区域的起始坐标
    left = (original_width - crop_width) / 2
    top = (original_height - crop_height) / 2
    right = left + crop_width
    bottom = top + crop_height

    # 确保裁剪区域不超出图片边界
    left = max(0, left)
    top = max(0, top)
    right = min(original_width, right)
    bottom = min(original_height, bottom)

    # 裁剪图片
    cropped_img = img.crop((left, top, right, bottom))
    # 如果图像有透明通道,转换为RGB模式
    if cropped_img.mode == 'RGBA':
        cropped_img = cropped_img.convert('RGB')

    # 保存裁剪后的图片
    cropped_img.save(output_path)

    # 可以选择显示图片,如果需要的话
    # cropped_img.show()

# 裁剪掉40%
crop_image_by_percentage(40, resize_save_path, crop_save_path)

三、网格畸变、水平翻转、平移缩放、旋转

# 数据增强: 网格畸变、水平翻转、分辨率调整、随机crop、换颜色
import cv2
import albumentations as A
import matplotlib.pyplot as plt

# 读取图片
# image_path = "path/to/your/image.jpg"
image_path = "G9_7097.jpg"
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB

# 定义数据增强管道
transform = A.Compose([
    A.HorizontalFlip(p=1),            # 水平翻转
    # A.VerticalFlip(p=0.5),              # 垂直翻转
    # A.RandomRotate90(p=0.5),            # 随机旋转90度
    # A.Transpose(p=0.5),                 # 交换行列(会旋转90度)
    # A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.1, rotate_limit=10, p=1),  # 平移、缩放、旋转
    A.OpticalDistortion(distort_limit=0.05, shift_limit=0.05, p=0.5),  # 光学畸变(颜色可能会改变)
    # A.GridDistortion(p=0.5),            # 网格畸变
    # A.ElasticTransform(alpha=1, sigma=50, alpha_affine=50, p=0.5)  # 弹性变换(会有拉伸效果)
])

# 应用数据增强
augmented = transform(image=image)
augmented_image = augmented['image']
# 转换回BGR格式以便保存
augmented_image = cv2.cvtColor(augmented_image, cv2.COLOR_RGB2BGR)
# 保存处理后的图片
save_path = = "save_G9_7097.jpg"
cv2.imwrite(save_path, augmented_image)

# 显示原图和增强后的图片
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(image)
ax[0].set_title('Original Image')
ax[0].axis('off')
ax[1].imshow(augmented_image)
ax[1].set_title('Augmented Image')
ax[1].axis('off')
save_path = "G9_7097_diff.jpg"
plt.savefig(save_path)
plt.show()

我这里只是水平翻转,如果需要用其他的旋转等操作,可以修改albumentations.Compose里的参数。这里的水平翻转后的结果如下图:
在这里插入图片描述
如果只需要翻转:

def fanzhuan_func(image_path, save_path):
    import cv2
    import albumentations as A
    import matplotlib.pyplot as plt
    # 读取图片
    # image_path = "/Users/guomiansheng/Desktop/LLM/ChatGLM2-6B/a_data/a_xiaopeng/pic2nl/two_car/G9_7097.jpg"
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB
    # 定义数据增强管道
    transform = A.Compose([
        A.HorizontalFlip(p=1)  # 只进行水平翻转
    ])
    # 应用数据增强
    augmented = transform(image=image)
    augmented_image = augmented['image']
    # 转换回BGR格式以便保存或显示
    augmented_image_bgr = cv2.cvtColor(augmented_image, cv2.COLOR_RGB2BGR)
    # 保存处理后的图片
    cv2.imwrite(save_path, augmented_image_bgr)

四、改变图片的背景颜色

在上面的基础上修改transform即可:

# 自定义变换函数,改变背景颜色并使图像变淡
class LightenBackground(A.ImageOnlyTransform):
    def __init__(self, color=(255, 255, 255), alpha=0.5, always_apply=False, p=1.0):
        super().__init__(always_apply, p)
        self.color = color
        self.alpha = alpha

    def apply(self, img, **params):
        # 创建与图像相同大小的纯色图像
        background = np.full_like(img, self.color, dtype=np.uint8)
        # 混合图像和背景颜色
        return cv2.addWeighted(img, 1 - self.alpha, background, self.alpha, 0)

# 读取图片
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB

# 定义数据增强管道,包括自定义的背景颜色变换
transform = A.Compose([
    LightenBackground(color=(255, 255, 0), alpha=0.1, p=1),  # 淡黄色背景,透明度为0.1
])

关于颜色的相关设定:

1. 白色:
LightenBackground(color=(255, 255, 255), alpha=0.3, p=1)

2. 黑色:
LightenBackground(color=(0, 0, 0), alpha=0.3, p=1)

3. 红色:
LightenBackground(color=(255, 0, 0), alpha=0.3, p=1)

4. 绿色:
LightenBackground(color=(0, 255, 0), alpha=0.3, p=1)

5. 蓝色:
LightenBackground(color=(0, 0, 255), alpha=0.3, p=1)

6. 黄色:
LightenBackground(color=(255, 255, 0), alpha=0.3, p=1)

7. 青色:
LightenBackground(color=(0, 255, 255), alpha=0.3, p=1)

8. 品红色:
LightenBackground(color=(255, 0, 255), alpha=0.3, p=1)

9. 灰色:
LightenBackground(color=(128, 128, 128), alpha=0.3, p=1)

10. 橙色:
LightenBackground(color=(255, 165, 0), alpha=0.3, p=1)

五、图片相似度检测

ORB(Oriented FAST and Rotated BRIEF) 是一种计算机视觉中常用的特征检测算法,它将 FAST 关键点检测和 BRIEF 描述符生成结合起来,同时引入了方向性和尺度不变性。使用 ORB 进行特征检测可以有以下几个应用:

  • 目标识别:在多幅图像中检测相同的ORB 特征点,并通过这些点的匹配确定目标物体的位置和方向
  • 图像匹配:在两幅图像中检测 ORB 特征点,并通过这些点的匹配来确定它们之间的相似度,可以用于图像拼接、图像比较等任务
  • 三维重建:在多幅图像中检测 ORB 特征点,并根据这些点的位置和方向计算出相机位姿,可以用于三维重建和增强现实等应用。
  • 目标跟踪: 在视频中检测 ORB 特征点,并通过这些点的跟踪来确定目标的运动轨迹和速度。
import cv2

def compute_orb_similarity(imageA_path, imageB_path):
    # 读取图片
    imageA = cv2.imread(imageA_path)
    imageB = cv2.imread(imageB_path)

    # 初始化ORB检测器
    orb = cv2.ORB_create()

    # 寻找关键点和描述符
    keypointsA, descriptorsA = orb.detectAndCompute(imageA, None)
    keypointsB, descriptorsB = orb.detectAndCompute(imageB, None)

    # 初始化BFMatcher
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    # 匹配描述符
    matches = bf.match(descriptorsA, descriptorsB)

    # 按照距离排序
    matches = sorted(matches, key=lambda x: x.distance)

    # 计算匹配关键点数量
    num_matches = len(matches)

    # 计算平均距离
    if num_matches > 0:
        avg_distance = sum(match.distance for match in matches) / num_matches
    else:
        avg_distance = float('inf')

    # 计算匹配的比例
    ratio_matches = num_matches / max(len(keypointsA), len(keypointsB))

    return num_matches, avg_distance, ratio_matches

# 示例使用
imageA_path = "奇瑞汽车_瑞虎8_SUV_蓝色_前方_苏LA006S_右前_32a.jpg"
imageB_path = "奇瑞汽车_瑞虎8_SUV_银色_前方_湘FCG315_左前_35a.jpg"
# imageB_path = "雷克萨斯_未知_SUV_白色_右边_鄂AS600T_右前_815.png"
# imageB_path = "奥迪_未知_轿车_白色_前方_未知_左后_1.jpg"
num_matches, avg_distance, ratio_matches = compute_orb_similarity(imageA_path, imageB_path)

# 评估: 匹配的关键点数量和匹配比例越高,平均距离越低,表示图片之间的相似度越高。
# 三个指标:计算匹配关键点数量、平均距离和匹配比例
print(f"Number of Matches: {num_matches}")
print(f"Average Distance: {avg_distance}")
print(f"Ratio of Matches: {ratio_matches:.2f}")

从上面结果可以验证还是有效的,同是奇瑞汽车时会这个匹配的关键点数量和匹配比例为0.29,如果是奇瑞和雷克萨斯则是0.26,说明图片越不相似。

六、图片复制

def copy_func(source_folder, destination_folder, now_image, target_image):
    import os
    import shutil
    # 定义源文件夹和目标文件夹
    # source_folder = 'path/to/a'
    # destination_folder = 'path/to/b'
    # 确保目标文件夹存在,如果不存在则创建
    os.makedirs(destination_folder, exist_ok=True)
    # 构建源文件路径和目标文件路径
    source_file = os.path.join(source_folder, now_image)
    destination_file = os.path.join(destination_folder, target_image)
    # 复制文件
    try:
        shutil.copy2(source_file, destination_file)
        print(f"Copied {source_file} to {destination_file}")
    except FileNotFoundError:
        print(f"File {source_file} not found.")
    except Exception as e:
        print(f"An error occurred: {e}")

    print("File copy operation completed.")

七、拼接多张图片

这里一般还有个要求,如果是横向水平拼接,一般将所有图片调整为所有图片中最小的高度(进行等比例缩放):

# 按照最小高度,对不同图片进行等比例缩放
from PIL import Image
import matplotlib.pyplot as plt
import os

def resize_images_to_same_height(image_paths, target_height):
    resized_images = []
    for image_path in image_paths:
        image = Image.open(image_path)
        # Calculate the new width to maintain the aspect ratio
        aspect_ratio = image.width / image.height
        new_width = int(target_height * aspect_ratio)
        # Resize the image
        resized_image = image.resize((new_width, target_height), Image.Resampling.LANCZOS)
        resized_images.append(resized_image)
    return resized_images

def concatenate_images_horizontally(images, output_path):
    # Find the total width of the final image
    total_width = sum(image.width for image in images)
    # Find the maximum height (all images have the same height after resizing)
    max_height = images[0].height

    # Create a new image with the appropriate size
    concatenated_image = Image.new('RGB', (total_width, max_height))

    # Paste each image into the new image
    current_x = 0
    for image in images:
        concatenated_image.paste(image, (current_x, 0))
        current_x += image.width

    # Display the concatenated image
    display(concatenated_image)
    # Save the concatenated image
    concatenated_image.save(output_path)

# 获取文件夹中的图片路径
folder_path = "/a_ex_all_pinpai_car/"
files = os.listdir(folder_path)
image_paths = [os.path.join(folder_path, file) for file in files if file.endswith(('jpg', 'jpeg', 'png'))]

# 动态确定目标高度(最小高度)
heights = [Image.open(image_path).height for image_path in image_paths]
target_height = min(heights)

# Resize images to the same height
resized_images = resize_images_to_same_height(image_paths, target_height)

# 输出路径
output_path = os.path.join(folder_path, 'concatenated_image.jpg')

# Concatenate images horizontally
concatenate_images_horizontally(resized_images, output_path)

这里拼接后的结果如下图:
在这里插入图片描述

备注:大模型的训练少不了算力资源,博主和一些平台有合作~
高性价比4090算力租用,注册就送20元代金券,更有内容激励活动,点击。
GPU云服务器租用,P40、4090、V100S多种显卡可选,点击。

Reference

[1] 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例

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

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

相关文章

机器学习与数据挖掘知识点总结(一)

简介:随着人工智能(AI)蓬勃发展,也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域,机器学习包含深度学习以及强化学习,在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

【JavaScript函数详解】Day04

JavaScript函数详解 JavaScript 基础 - 第4天笔记函数声明和调用声明(定义)调用 参数形参和实参参数默认值 返回值函数补充细节作用域全局作用域局部作用域变量的访问原则 匿名函数函数表达式立即执行函数 逻辑中断小知识(转换为Boolean型&am…

WPF视频学习-基础知识篇

1.简介WPF: C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 ,(WPF比较新) 创建新项目使用模板: WPF使用.xaml后缀,双击可查看操作界面和设置代码,其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

Vitis HLS 学习笔记--初始化与复位

目录 1. 简介 2. 控制初始化与复位 2.1 初始化 2.2 复位 2.3 全局复位选项 2.4 复位排除 3. 阵列初始化和复位 3.1 不使用 static 限定符 3.2 使用 static 限定符 3.3 BRAM 和 URAM 4. 总结 1. 简介 本文对比分析两个方面的初始化和复位:阵列和控制&…

如何检测UV胶的均匀性?

如何检测UV胶的均匀性? 检测UV胶的均匀性可以通过以下几种方法来实现: 肉眼目视检查: 这是最简单直接的方法。将UV胶涂在表面上,使用裸眼观察胶层的表面。特别注意是否存在气泡、颜色不均匀、裂纹或其他明显的不均匀性。如凹凸不…

选择排序(直接选择排序与堆排序)----数据结构-排序②

1、选择排序 1.1 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,放在序列的起始位置,直到全部待排序的数据元素排完就停止 。 1.2 直接选择排序 排序思想: ①在元素集合array[i]--array[n-1]中选择…

FM148A,FM146B运行备件

FM148A,FM146B运行备件。电源保险丝仓主控底座的保险丝仓示意图底座上共有两个保险丝(800mA),FM148A,FM146B运行备件。(10~73)30/195主控单元2.K-CUT014槽底座地址接口主控站地址拨开关从上到下为二进制数的…

Day46 代码随想录打卡|二叉树篇---从中序与后序遍历序列构造二叉树

题目(leecode T106): 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 方法:本题要通过中序遍历和后…

Windows无法安装到这个硬盘空间。选定的分区上启用了BitLocker驱动器加密。请在控制面板中暂停(也称为禁用)BitLocker,然后重新开始安装。

我们安装操作系统的时候,到了选择安装分区的地方,我们选中的分区提示“无法在驱动器的分区上安装Windows”,然后我们点击显示详细信息,提示如图下所示 分析原因,可能是之前的分区未进行格式化。但是这个时候我们无法格…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 (仿真+程序) 功能介绍 具体功能: 1.用滑动变阻器模拟水位,ADC0809将模拟信号转换为数字信号; 2.LCD1602显示当前水位和水位阈值; 3.当水位超过设定阈值&#xff…

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件,pc13设置为输出模式 然后按照这样配置,user label 设置成这个IO口代…

Go微服务: 关于消息队列的选择和分类以及使用场景

消息队列概述 在分布式系统和微服务架构中,消息队列(Message Queue)是一个核心组件,用于在不同的应用程序或服务之间异步传递消息在 Go 语言中,有多种实现消息队列的方式,包括使用开源的消息队列服务&…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具,您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的,相当于攻击前的索敌步骤。不止网络安全方面会用到,平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载,然后点你用的平台就行了 往下滚可以…

[职场] 硬件研发是什么职业 #职场发展#其他

硬件研发是什么职业 硬件研发工程师需要具备丰富的电子电路知识、熟练掌握各种电子元器件的性能及应用、具备一定的机械结构设计能力,同时还要具备良好的团队协作和沟通能力。本文会进行详细介绍。 一、硬件研发是什么 硬件研发,全称硬件研发工程师&am…

一文搞懂Python的异常

人生之事,不如意者十之有九。 在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。 概念 异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。 举个实际生活的例子: 你周末出门买大龙虾,但当你…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表,采用HBuilderX将程序转化为5App,实现移动端的适配;支持桌面打开新应用,底部导航展示当前应用列表,可切换或关…

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来,凭借其基于 Gear Protocol 的独特架构和强大的开发工具,为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术,实现了异步消息处理、并行计算…

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性,用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数,避免了回调地狱问题&#xff0…