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

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) / 2top = (original_height - crop_height) / 2right = left + crop_widthbottom = 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 cv2import albumentations as Aimport 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 = colorself.alpha = alphadef 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 cv2def 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)# 初始化BFMatcherbf = 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_matcheselse: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 osimport 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 osdef 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 ratioaspect_ratio = image.width / image.heightnew_width = int(target_height * aspect_ratio)# Resize the imageresized_image = image.resize((new_width, target_height), Image.Resampling.LANCZOS)resized_images.append(resized_image)return resized_imagesdef concatenate_images_horizontally(images, output_path):# Find the total width of the final imagetotal_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 sizeconcatenated_image = Image.new('RGB', (total_width, max_height))# Paste each image into the new imagecurrent_x = 0for image in images:concatenated_image.paste(image, (current_x, 0))current_x += image.width# Display the concatenated imagedisplay(concatenated_image)# Save the concatenated imageconcatenated_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)

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

Reference

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

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

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

相关文章

mysql 8 linux7,8安装教程

选择自己对应的linux版本 cat /etc/os-release //查看自己linux系统版本 1.mysql下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 拉到下面找到 选择自己linux指定的版本,否则会很麻烦 cat /etc/os-release //查看系统版本 2.查…

50etf期权怎么开户?期权懂有几种方式?

今天带你了解50etf期权怎么开户?期权懂有几种方式?50ETF期权开户可以通过证券公司、期权交易平台或期权交易应用进行。投资者需填写开户申请表格,提供身份证明和其他资料,完成开户手续。 50etf期权怎么开户? 满足资金…

欢乐钓鱼大师辅助:哪家云手机自动钓鱼更好操作!

在探索《欢乐钓鱼大师》的世界时,我们不得不提到一个强大的游戏辅助工具——VMOS云手机。通过VMOS云手机,你可以轻松实现自动钓鱼,让游戏体验更加便捷高效。 什么是VMOS云手机? VMOS云手机是一款基于虚拟机技术的云端工具&#…

ubuntu20.04中设置包含ros节点的文件自启动

若文件里包含了ros话题的发布和接收,那么设置自启动时,应该首先将roscore设置为自启动。 首先确保roscore有一个systemd服务文件。如果还没有,需要在/etc/systemd/system/下创建一个。例如,一个基本的roscore.service文件可能如下…

安徽代理记账公司的专业服务和创新理念

在当今竞争激烈的市场环境中,为了提升企业的运营效率,许多企业开始寻找专业的代理记账公司进行财务管理和记账,本文将介绍一家名为安徽代理记账公司的专业服务和创新理念。 安徽代理记账公司是一家专注于为企业提供全方位会计服务的公司&…

SwiftUI中Mask修饰符的理解与使用

Mask是一种用于控制图形元素可见性的图形技术&#xff0c;使用给定视图的alpha通道掩码该视图。在SwiftUI中&#xff0c;它类似于创建一个只显示视图的特定部分的模板。 Mask修饰符的定义&#xff1a; func mask<Mask>(alignment: Alignment .center,ViewBuilder _ ma…

大屏可视化建设方案(word)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

9.1 Go 接口的定义

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

算法训练营day03--203.移除链表元素+707.设计链表+206.反转链表

一、203.移除链表元素 题目链接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/ 文章讲解&#xff1a;https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html 视频讲解&#xff1a;https://www.bilibili.com…

Python报错:IndentationError: unexpected indent问题的解决办法及原因

解决Python报错&#xff1a;IndentationError: unexpected indent问题的解决办法及原因 Python是一种注重可读性的编程语言&#xff0c;它使用缩进来定义代码块。如果你遇到了IndentationError: unexpected indent的错误&#xff0c;这意味着Python解释器在代码中遇到了意外的缩…

阿里云(域名解析) certbot 证书配置

1、安装 certbot ubuntu 系统&#xff1a; sudo apt install certbot 2、申请certbot 域名证书&#xff0c;如申请二级域名aa.example.com 的ssl证书&#xff0c;同时需要让 bb.aa.example.com 也可以使用此证书 1、命令&#xff1a;sudo certbot certonly -d “域名” -d “…

使用亮数据代理IP爬取PubMed文章链接和邮箱地址

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

排查互联网敏感信息,对信息泄露说“不”

前言 01 近几年&#xff0c;随着我国对网络安全的重视&#xff0c;贴近实战的攻防演练活动越发丰富&#xff0c;各单位的网络安全建设也逐步从“事后补救”升级为“事前防控”。在演练中&#xff0c;进攻方会在指定时间内对防守方发动网络攻击&#xff0c;检测出防守方存在的…

04 架构核心技术之分布式消息队列

本课时的主题是分布式消息队列&#xff0c;分布式消息队列的知识结构如下图。 本课时主要介绍以下内容。 同步架构和异步架构的区别。异步架构的主要组成部分&#xff1a;消息生产者、消息消费者、分布式消息队列。异步架构的两种主要模型&#xff1a;点对点模型和发布订阅模型…

【讯为Linux驱动开发】5.并发与竞争

并发&#xff1a;一个CPU在一个时间片只能执行一个任务&#xff0c;切换速度很快。 并行&#xff1a;双核CPU&#xff0c;真正的同时执行两个任务 并行就是并发的理想情况&#xff0c;统称并发。 【问】Linux在什么情况下产生并发&#xff1f; 1.中断中修改公共资源 2.抢占…

【静夜思】小时候的回忆

为什么大家都会对自己童年时期的评价很高&#xff1f;甚至是一些模糊都快到想不起来的记忆&#xff1f; 博主是00后&#xff0c;那时候小学的我非常喜欢看动画片&#xff0c;像经典的喜羊羊、熊出没、胡图图等等&#xff0c;太多了。等上了高中后&#xff0c;博主也成为了一名…

全光网络与传统网络架构的对比分析

随着信息技术的飞速发展&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。在这个信息爆炸的时代&#xff0c;全光网络和传统网络架构作为两种主流的网络技术&#xff0c;各有其特点和适用范围。本文将对这两种网络架构进行详细的对比分析&#xff0c;帮助读者更好地了…

大学生创新与创业搜题软件?推荐7个搜题软件和学习工具 #媒体#知识分享

随着大学课程的增多和知识的不断积累&#xff0c;大学生们常常面临着繁重的作业和复杂的题目。为了解决这一问题&#xff0c;许多大学生搜题软件应运而生。 1.彩虹搜题 这个是公众号 个性化推荐功能&#xff0c;精准满足需求。更高效地获取你想要的答案。 下方附上一些测试的…

stack overflow复现

当你在内存的栈中&#xff0c;存放了太多元素&#xff0c;就有可能在造成 stack overflow这个问题。 今天看看如何复现这个问题。 下图&#xff0c;是我写的程序&#xff0c;不断的创造1KB的栈&#xff0c;来看看执行了多少次&#xff0c;无限循环。 最后结果是7929kB时, 发…

C++| 一维线性插值、imadjust函数

前言&#xff1a;最近要从Matlab代码改C代码&#xff0c;不能直接用Matlab生成的C代码&#xff0c;因为需要嵌入到已有项目中。Matlab本身有很多很方便的数学公式&#xff0c;但是在C里没有相关的库的话&#xff0c;需要自己实现。 一维线性插值、imadjust函数 一维线性插值原理…