【深度学习实验】图像处理(四):PIL——自定义图像数据增强操作(图像合成;图像融合(高斯掩码))

文章目录

  • 一、实验介绍
  • 二、实验环境
    • 1. 配置虚拟环境
    • 2. 库版本介绍
  • 三、实验内容
    • 0. 导入必要的库
    • 1. PIL基础操作
    • 2~4. 随机遮挡、随机擦除、线性混合
    • 5. 图像合成
      • 5.1 原理
      • 5.2 实现
      • 5.3 效果展示
    • 6. 图像融合
      • 6.1 原理
      • 6.2 实现
      • 6.3 效果展示

一、实验介绍

  在深度学习任务中,数据增强是提高模型泛化能力的关键步骤之一。通过对训练集进行变换和扩充,可以有效地增加数据量,引入样本之间的差异,使模型更好地适应不同的输入。
  本实验将继续实现自定义图像数据增强操作,具体包括图像合成(粘贴组合)、图像融合(创建高斯掩码融合两个图像)

二、实验环境

1. 配置虚拟环境

conda create -n Image python=3.9 
conda activate Image
conda install pillow numpy

2. 库版本介绍

软件包本实验版本
numpy1.21.5
python3.9.13
pillow9.2.0

三、实验内容

0. 导入必要的库

import numpy as np
from PIL import Image

1. PIL基础操作

【深度学习实验】图像处理(一):Python Imaging Library(PIL)库:图像读取、写入、复制、粘贴、几何变换、图像增强、图像滤波

【深度学习实验】图像处理(二):PIL 和 PyTorch(transforms)中的图像处理与随机图片增强

2~4. 随机遮挡、随机擦除、线性混合

【深度学习实验】图像处理(三):PIL——自定义图像数据增强操作(随机遮挡、擦除、线性混合)

5. 图像合成

5.1 原理

  1. 输入图像:

    • 图像1 \text{图像1} 图像1
      在这里插入图片描述
    • 图像2 \text{图像2} 图像2
      在这里插入图片描述
  2. 遮挡和选择:

    • 遮挡图像1中的区域 x x x
      • 随机选择要遮挡的图像1中的区域 x x x(引入了训练数据的变异性)
    • 从图像2中选择对应区域 y y y
      • 选择与图像1中被遮挡区域 x x x 相对应的图像2中的区域 y y y
  3. 粘贴:

    • y y y 粘贴到图像1中的 x x x 位置:
      • 将从图像2中选择的区域 y y y 粘贴到图像1中被遮挡的区域 x x x 的位置(模拟了一种图像混合的效果)
  4. 输出:

    • 返回增强后的图像1,其中现在包含了粘贴的区域 y y y

5.2 实现

class Combine(object):def __init__(self,x_start, y_start, x_end, y_end):self.x_start = x_startself.y_start = y_startself.x_end = x_endself.y_end = y_enddef __call__(self, img1, img2):# Masking out a region x of image1img1_array = np.array(img1)img1_array[self.y_start:self.y_end, self.x_start:self.x_end] = 0img1_masked =  Image.fromarray(img1_array.astype('uint8')).convert('RGB')# Selecting a region y of the same as x from image2region_y = img2.crop((self.x_start, self.y_start, self.x_end, self.y_end))# Pasting region y on the location of x of image1img1_masked.paste(region_y, (self.x_start, self.y_start))return img1_masked

5.3 效果展示

img1 = Image.open('3.png').convert('RGB')
img2 = Image.open('2.png').convert('RGB')
combine = Combine(628, 128, 1012, 512)
img = combine(img1,img2)
img.save('./combine_image.png')

在这里插入图片描述

6. 图像融合

6.1 原理

  通过高斯核函数创建掩码,以在两个图像之间进行融合。

  1. 调整样本 x j x_j xj(2.jpg)的大小以匹配样本 x i x_i xi(1.jpg);
  2. x i x_i xi(或 x j x_j xj)内选择一个随机位置 C C C
  3. 使用二维标准高斯核函数创建掩码 G G G,确保其中心与位置 C C C 对齐,并且其大小与 x i x_i xi 相匹配;
  4. 使用 G G G 修改 x i x_i xi,并使用 1 − G 1-G 1G 修改 x j x_j xj
  5. 将得到的修改组合在一起,得到 x ^ \hat x x^
  6. 返回 x ^ \hat x x^

6.2 实现

class Gaussian(object):def __init__(self, sigma):# 混合参数self.sigma = sigmadef __call__(self, img1, img2):# Choose a random position, labeled as $C$, within $x_i$ (or $x_j$)self.size = img1.shape[1], img1.shape[0]print(self.size)x = np.random.randint(0, img1.shape[1])y = np.random.randint(0, img1.shape[0])position_c = (x, y)print(position_c)# Create mask $G$ using a 2D standard Gaussian kernel function,# ensuring its center aligns with position $C$, and the size of $G$ matches that of $x_i$mask_g = self.gaussian_mask(position_c)# print(mask_g.shape)mask_g = np.expand_dims(mask_g, axis=2)mask_g = np.repeat(mask_g, 3, axis=2)# print(mask_g.shape)# Use $G$ to modify $x_i$ and use $1-G$ to modify $x_j$# Combine the resulting modifications together as $\hat x$hat_x = img1 * mask_g + img2 * (1 - mask_g)return hat_xdef gaussian_mask(self, center):x, y = np.meshgrid(np.arange(0, self.size[0]), np.arange(0, self.size[1]))d = np.sqrt((x - center[0]) ** 2 + (y - center[1]) ** 2)gaussian_mask = np.exp(-(d ** 2 / (2.0 * self.sigma ** 2)))return gaussian_mask

6.3 效果展示

# Input two images, which are image1 (1.jpg) and image2 (2.jpg)
img1 = Image.open('2.png').convert('RGB')
img2 = Image.open('3.png').convert('RGB')
# Adjust the size of Sample $x_j$ (2.jpg) to match Sample $x_i$ (1.jpg)
img2 = img2.resize(img1.size, Image.Resampling.BICUBIC)
img1 = np.array(img1)
img2 = np.array(img2)
gaussian = Gaussian(300)
img = gaussian(img1,img2)
img = Image.fromarray(img.astype('uint8')).convert('RGB')
img.save('./gaussian_image.png')

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

csapp-linklab

超详细csapp-linklab之第一阶段“输出学号”实验报告-CSDN博客 csapp-linklab之第二阶段“输出学号”实验报告-CSDN博客 csapp-linklab之第3阶段“输出学号”实验报告(强弱符号)-CSDN博客 csapp-linklab之第4阶段“输出学号”实验报告(swi…

wordpress主题的后台Settings API 和 Theme Customizer API开发部分

先看两个概念Settings API和Theme Customizer API Settings API和Theme Customizer API是WordPress提供的用于处理主题和插件设置的工具。它们分别用于不同的场景和目的,但都旨在简化在WordPress仪表板中添加设置和选项的过程。 Settings API Settings API主要用…

java_基础——ArrayList

1.ArrayList构造方法和添加方法 方法名说明public ArrayList创建一个空的集合对象public boolean add(E e)将指定的元素追加到此集合的末尾public void add(int index,E element)在此集合的指定位置插入指定的元素 import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_O…

MySQL进阶_EXPLAIN重点字段解析

文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…

【数据结构高阶】AVL树

上期博客我们讲解了set/multiset/map/multimap的使用,下面我们来深入到底层,讲解其内部结构: 目录 一、AVL树的概念 二、AVL树的实现 2.1 节点的定义 2.2 数据的插入 2.2.1 平衡因子的调整 2.2.1.1 调整平衡因子的规律 2.2.2 子树的旋…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…

2023-12-03 LeetCode每日一题(可获得的最大点数)

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌&#x…

【Python/Java/C++三种语言】20天拿下华为OD笔试之【哈希表】2023B-单词接龙【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 单词接龙的规则是: 可用于接龙的单词首字母必须要前一个单词的…

虚拟机扩容磁盘/dev/mapper/centos-root

虚拟机扩容磁盘/dev/mapper/centos-root 1. 在虚拟机管理界面增加磁盘大小或添加磁盘 2. 扩容操作 lsblk -l # 下面/dev/sdb 每个人的可能不同,有/dev/sda 或 /dev/sdc,根据实际更改 fdis /dev/sdb m n p 1 回车 回车 wfdisk -l pvdisplay pvcrea…

Vue.js中v-if 和 v-show 的区别

1、v-if: v-if 指令是 Vue.js 中的一个条件渲染指令。 当 v-if 的条件为 false 时,元素及其内容将从 DOM 中完全移除。 适用于你期望大部分时间条件为 false,或者当你希望通过完全移除元素来节省资源时。 2、v-show: v-show 指令同样也是一个条件渲染…

信息流广告行为兴趣定向底层逻辑算法

行为兴趣定向 1: 行为兴趣的背后是计划的数据 行为是用户在平台的动作:点赞、评论、分享、点击、下单、成交等,用户发生过的标签 兴趣不一定发生,我有打高尔夫的兴趣,但是从来没打过,因为穷 系统会根据用户的行为标…

C++STL中的string容器

string 容器基本概念 C 风格字符串 ( 以空字符结尾的字符数组 ) 太过复杂难于掌握,不适合大程序的开发, 所以 C 标准库定义了一种 string 类,定义在头文件。 String 和 c 风格字符串对比: u Char*是一个指针, …

【C++ Primer Plus学习记录】第5章编程练习

1.编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间(包括这两个整数)所有整数的和。这里假设先输入较小的整数。例如,如果用户输入的是2和9,则程序将指出2~9之间所有整数的和为44。 //5.9 1 #if 1 #includ…

使用OpenMVS重建模型

1、数据格式转换 首先将生成的稠密点云以及图片信息转换成openmvs支持的.mvs文件。在openmvs_sample中的bin文件内打开终端 作者:舞曲的小水瓶 https://www.bilibili.com/read/cv25019877/ 出处:bilibili interfaceCOLMAP.exe -i D:\desktop\test\toy\…

【Linux服务器Java环境搭建】05 Node JS安装及环境变量配置

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装(JAVA环境安装) 【Linux服…

flink源码分析 - 命令行参数解析-CommandLineParser

flink版本: flink-1.11.2 调用位置: org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint#main 代码位置: flink核心命令行解析器: org.apache.flink.runtime.entrypoint.parser.CommandLineParser /** Licensed to the Apache Software Foundati…

基于OpenAPI工具包以及LSTM的CDN网络流量预测

基于LSTM的CDN网络流量预测 本案例是基于英特尔CDN以及英特尔 OpenAPI Intel Extension for TensorFlow* Intel oneAPIDPC Library 的网络流量预测,CDN是构建在现有网络基础之上的智能虚拟网络,目的是将源站内容分发至最接近用户的节点,使用…

unity学习笔记17

一、动画组件 Animation Animation组件是一种更传统的动画系统,它使用关键帧动画。你可以通过手动录制物体在时间轴上的变换来创建动画。 一些重要的属性: 1. 动画(Animation): 类型: Animation组件允许…

java为什么要设计8个基本数据类型的封装类型?

Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。然而,这些基本数据类型并非对象,他们只是简单的数值,无法调用方法。 为了能在Java这种面向对象的语言中更好地操作这些数值,Java设计了对应的8个…

换股解套策略

在股市中,投资者难免会遇到被套的情况。面对这种情况,如何进行换股策略以降低损失并寻求反弹的机会呢?本文将为您详细解析。 一、了解被套的原因 在进行换股策略之前,首先要了解被套的原因。一般来说,被套的原因有以下…