基于PyTorch的图像数据归一化min-max normalization和zero-mean normalization操作实践对比分析

news2024/11/25 7:11:58

本文紧接前文:

《python基于不同方法实现特征工程常用的归一化技术Normalization对比分析》

前文主要是讲解对于数值型特征数据在特征工程或者是数据处理阶段往往需要用到数据尺度归一化操作,基于原生的对象和numpy第三方库分别实现了按列归一化计算和整体归一化计算,基于真实的数据进行对比分析,验证两种方法的正确性。

本文主要是针对图像数据来进行归一化处理。

这里主要实现了三种项目中常用的操作。

第一种:

直接除以255.0实现原始图像的缩放处理

第二种:

跟前文同样的基础原理,基于min-max实现归一化操作计算

第三种:

基于zero-mean实现归一化操作计算,将原始图像数据分布转化为正态分布形态

至于具体的原理这里就不再赘述了,感兴趣话可以直接查对应的资料即可,这里直接看代码实现,如下所示:

def channelTranspose(tensor):
    """
    图像通道调整
    """
    img_arr = np.array(tensor)
    img_tr = img_arr.transpose(1, 2, 0)
    return img_tr




def imgNormalization(pic="test.jpg"):
    """
    图像归一化
    """
    img = Image.open(pic)
    transform = transforms.Compose([transforms.ToTensor()])
    img_tensor = transform(img)
    mean, std = img_tensor.mean([1, 2]), img_tensor.std([1, 2])
    transform_norm = transforms.Compose(
        [transforms.ToTensor(), transforms.Normalize(mean, std)]
    )
    img_normalized = transform_norm(img)
    img_np = np.array(img)
    print(img_np.shape)
    simple = img_np / 255.0
    print("mean and std before normalize:")
    print("Mean of the image:", mean)
    print("Std of the image:", std)
    result1 = channelTranspose(img_tensor)
    result2 = channelTranspose(img_normalized)
    # 可视化对比
    imgs_list = [img_np, simple, result1, result2]
    titles = ["orignal", "simple", "min-max normalization", "zero-mean normalization"]
    figsize = (20, 16)
    _, axes = plt.subplots(2, 2, figsize=figsize)
    axes = axes.flatten()
    for i, (ax, img) in enumerate(zip(axes, imgs_list)):
        try:
            img = np.array(img)
        except:
            pass
        ax.imshow(img)
        ax.axes.get_xaxis().set_visible(False)
        ax.axes.get_yaxis().set_visible(False)
        if titles:
            ax.set_title(titles[i])
    plt.savefig(save_path)

测试图像如下:

 结果图像如下所示:

 从直观效果上来看:不难分析出来simple方法和min-max方法得到的结果应该是大致相同甚至是完全相同的,这个从min-max的计算公式上面就可以窥探出来。

为了进一步验证猜想,这里对其每种方法计算处理后得到的图像像素分布直方图进行了可视化对比分析展示,直方图的粒度可以自由调整,我这里由粗到细分别展示不同方法处理后的对比可视化结果,如下所示:

 经此可视化过程直观展示能够非常细致地看出来三种不同的处理方法存在的差异性了。

感兴趣的话可以自行实践,记录备忘!

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

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

相关文章

一文告诉你什么是开源表单系统

熟悉市场的人都知道,传统的表单存在效率低的瓶颈,无法满足当前很多企业的业务需求。开源表单系统也是顺应时代发展需求应运而生的产物,在提升企业办公效率和协作效率,推动企业数字化转型方面意义重大。今天这篇文章就告诉大家什么…

《计算机网络》——第一章知识点

考试题型: 选择题填空题判断题简答题计算题ISP:因特网服务提供者/因特网服务提供商,是一个向广大用户综合提供互联网接入业务、信息业务、和增值业务的公司,如中国电信、中国联动、中国移动等。分为主干ISP、地区ISP和本地ISP。 计算机网络∶利用通信线…

前端的实例化是什么?

我们在用vue框架的时候,总是会看到各种各样的实例化或者说实例化对象(实例) 所以这篇文章就谈一下什么是实例化和实例化对象(实例),以及为什么要实例化的问题 前端的实例化是什么?vue的createApppinia的实例化为什么要实例化再一次回答上面这…

关于缓存问题的思考与总结

提到缓存,最容易想到的便是Redis了。Redis凭借其出色的性能表现,十分适合做缓存。那么为什么需要缓存这个东西以及缓存用在哪些地方呢? 一、基本原理 存储层次模型 注:也是背景来源 想要设计好的架构或者应用、程序&#xff0c…

Maven安装配置的保姆级教程

前言 下面是关于maven的一些介绍: maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等maven的好处在于可以将项目过程规范化、自动化、高效化以及…

C++程序设计——继承与派生

更多内容可以查看系列文章C语言入门全教程(持续更新) 目录 前言 一、继承的概念 1.楔子 2.派生类的定义 3.继承和派生的意义 4.案例1:派生类的定义 二、继承方式 1.公有继承(public) 2.保护继承(…

网络拓扑结构可视化呈现方案

随着数字化进程的加速,企业网络中设备的数量日益快速增长,网络规模逐渐庞大,组网结构、IT 环境变的无比复杂,需要花费大量的时间和资源去监测网络运行状态,诊断解决故障问题。面对不断趋向复杂化和多样化的网络规模和结…

Mac M1使用Docker报错 Failed to get D-Bus connection: No such file or directory的解决方案

0x00 前言 最近在Mac上安装docker的CentOS7镜像,打算开个sshd服务,使用命令: $ systemctl start sshd结果在启动sshd服务的时候提示报错: Failed to get D-Bus connection: No such file or directory0x01 运行环境 版本MacOS…

《Qt开发》基于QwtPolar的极坐标图绘制

QwtPolar绘制极坐标图 该示例包含以下功能: 使用QwtPolarPlot绘制极坐标曲线实现曲线的缩放和平移调整极坐标为顺时针顺序1. 创建项目 创建项目名称为QwtPolarDemo1,并添加一个Qt5Class类,命名为myPlot。 2. 配置项目 在项目——属性——C/C——常规…

【C++】——初识C++(一)

文章目录1. 进入C1.1 main()函数1.2 C注释1.3 C预处理器和iostream文件1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.6.1 控制符endl1.6.2 换行符1.6.3 使用cout进行拼接1.7 cin1.8 变量1.8.1 变量名1.9 常量1.10 关键字1. 进入C 第一个程序 // my…

构建数据大屏,塑造IT运维可视化核心竞争力

随着大数据、云计算等新兴技术的发展与运用,在金融、交通、教育、政府等行业的信息化在飞速发展。与此同时,各行业的IT建设与维护管理成本也在与日俱增,大量的运维工作下产生庞大的运维数据,如何进行运维数据可视化建设也逐渐成为…

qt之smtp-demo封装与测试

简介 SMTP是一种提供可靠且有效的电子邮件传输的协议,它建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。 SMTP的工作过程是建立连接、邮件传送、连接释放。 SMTP的默认端口是25。…

游戏思考26:使用EASTL配合共享内存做自定义STL(未完待续12/27)

文章目录一、前置学习1&#xff09;萃取&#xff08;1&#xff09;迭代器所指对象的类型-value_type<1>第一个限制-返回参数需要指明迭代器的value_type<2>第二个限制坑点-不是所有迭代器都是class type&#xff0c;原生指针就不是<3>第三个限制坑点-如果针对…

2022-12版本的Rstudio它来了,它喊我升级了

1. Rstudio喊我升级 最近每一次打开Rstudio&#xff0c;总是推送给我最新版的Rstudio&#xff1a; 它之前不是这样的&#xff0c;那时候它所在的公司还叫Rstudio&#xff0c;现在改名叫Posit了&#xff0c;就开始推送了&#xff0c;也许它认为是重大的更新&#xff0c;也许他能…

【vue面试题-vuex】

vuex1.vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f;2.vuex有哪几种属性&#xff1f;3.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中&#xff1f;4.Vuex解决了什么问题&#xff1f;5.Vuex中状态储存在哪里&#xff0c;怎么改…

【LeetCode】1739. 放置盒子

1739. 放置盒子 题目描述 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y 的顶部&…

【webpack】cjs运行时分析

准备工作&#xff08;接上篇文章的示例也可以&#xff09;&#xff1a; 1. 在index.js文件中引入任一js文件 import sum from ./sum;const result sum(1,2); console.log(result);2. sum文件 const sum (a, b) > {return ab; }export default sum3. build.js文件 const…

离子交换法深度剖析

离子交换法 是一种借助于离子交换剂上的离子和污水中的离子进行交换反应而除去污水中有害离子的方法。 离子交换法的特点 离子交换过程是一种特殊的吸附过程&#xff0c;在许多方面与吸附过程类似。 与吸附法比较&#xff0c;其特点是:它主要吸附污水中的离子化物质&#xff…

怎样做一个不会被淘汰的车载诊断工程师

步入中年&#xff0c;不可避免会接触到所谓的中年危机&#xff0c;时刻在提醒自己提高自己的护城河&#xff0c;增强核心竞争力。但是这种事情也不是靠空想&#xff0c;还是要功夫下在平时。 自己是在2016年开始接触车载诊断方面&#xff0c;从事过诊断范畴的开发、测试、偏系…

程序员的圣诞节是怎么样的?

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 圣诞节&#xff0c;先在这里祝大家圣诞节快乐~~&#xff0c;用英语来表达就是 Merry Christmas ~~&#xff0c; 为了贴合这个氛围&#xff0c;今天分享种用 Python 绘制圣诞树的方法。 最近用代码绘画圣诞…