对CT数据进行最小最大值归一化(Min-Max Normalization)和消除过暗过亮值处理

news2024/10/7 6:41:31

文章目录

    • PIL库的图像失真问题
    • 使用最小最大值归一化(Min-Max Normalization)预处理
    • 消除过暗过亮值
    • pytorch中对tensor使用最小最大值归一化处理(torchvision.transforms)

我们在处理CT图像时(以dcm格式为例),在数据预处理方面(主要和PIL.Image相关)会出现图像失真的问题。
我们可以使用最小最大值归一化(Min-Max Normalization)和消除过暗过亮值,来解决相关问题。下面详述。

本文需要用到处理dcm文件的库:pydicom。

本文代码:my GitHub

PIL库的图像失真问题

我们从dcm数据中获取数据矩阵时,直接用 Image.fromarray() 读取时会出现图像失真。

例:

我们先用plt.imshow显示图像没有问题。
在这里插入图片描述

用Image读入图像矩阵后,convert过后就出现了问题:
在这里插入图片描述

由于图像矩阵传入PIL库后,模式(mode)一般是F(浮点型)或I(整形),无法进一步处理(比如另存为jpg图像格式、在notebook中显示等)。
所以我们一般会使用 convert 方法转换mode,灰度图我们一般转成 “L” 模式。
但是这样会导致图像失真,效果如上图所示。

模式说明
11位像素,黑和白,存成8位的像素
L8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3×8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,颜色隔离
YCbCr3×8位像素,彩色视频格式
I32位整型像素
F32位浮点型像素

我们可以将矩阵求和来验证一下是否失真:
在这里插入图片描述

以上可以看到 convert(‘L’) 后,图像矩阵的数值已经产生了变化,这也解释了为什么显示出来的图像和plt.imshow()显示的有很大的差别

使用最小最大值归一化(Min-Max Normalization)预处理

我们发现使用convert方法对数值范围的要求在 0~255 之间。而这张图像的矩阵的数值最高达到了2242,所以convert时出现了问题。
最小最大值归一化(Min-Max Normalization)可将矩阵全体数值线性映射到[0, 1]之间。
最后再全体乘以255即可。


我们在传入Image之前对矩阵进行归一化:

max_value = img_array.max()
min_value = img_array.min()
img_array = (img_array - min_value) / (max_value - min_value)
img_array = img_array * 255

具体实现:
在这里插入图片描述

在这里插入图片描述

以上经过最小最大值归一化,并乘以255后,图像基本就不失真了!

消除过暗过亮值

在实际情况中,不少CT图像的矩阵存在背景数值(CT值)为-2000,并且还会有带极高亮斑的情况。
这种光光做Min-Max Normalization是不够的。


举个例子(观察最大值和最小值):
在这里插入图片描述

以上我们发现经过Min-Max Normalization后,图像变得非常暗淡。
我们计算了数据最大值: 9435.0 ,数据最小值: -2000.0
我们查看一下图像矩阵的一行。

在这里插入图片描述

可以发现背景的数值是 -2000,并且普通组织区域的数值大约在0~3000左右。
最大值9435应该对应的是图像中的某个亮斑,属于干扰值。
我们可以将图像进行进一步处理,将-2000的部分改成0,大于3000的值改成3000

在这里插入图片描述

以上就正常多啦~

pytorch中对tensor使用最小最大值归一化处理(torchvision.transforms)

torchvision.transforms中没有对应最小最大值归一化的方法。
想要在pytorch数据处理中使用最小最大值归一化,可以自己写一个方法放入transoms.Compose中。

消除过暗过亮值 和 最小最大值归一化 处理后的CT图像数据在训练时有助于收敛并提高模型准确率指标。


代码实例:
我们编写一个NormalizeTensor函数即可

from torchvision import transforms
import torch

def NormalizeTensor(data):
    minimal = torch.min(data)
    return (data - minimal) / (torch.max(data) - minimal)

transform = transforms.Compose([
    transforms.Resize((224,224)),
    transforms.ToTensor(),
    NormalizeTensor,
])

img_open=pydicom.read_file(dcm2)
img_array = img_open.pixel_array
img_array = np.array(img_array, dtype=np.float32)

# 消除过暗过亮值
img_array = np.maximum(img_array, 0)  # 消除-2000 CT值
img_array = np.minimum(img_array, 3000)  # 消除极亮值

img_array_pil = Image.fromarray(img_array)
img = img_array_pil.convert('L')

img_tensor = transform(img)

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

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

相关文章

全栈小程序开发路线

目录 个人心得: 我的学习路线 个人心得: 我擅长的是小程序开发和技术变现,从2021年至今开发上线20于个小程序,矩阵用户超过10万,变现10万左右。 以下是部分小程序截图,追风口做的小程序,基本…

「Win」Windows注册表介绍与操作

✨博客主页:何曾参静谧的博客 📌文章专栏:「Win」Windows程序设计 相关术语 Windows的注册表:是一个重要的系统组件,用于存储操作系统和应用程序的配置信息。它类似于一个数据库,包含了各种键值对、参数、设…

Vue报错:Error: error:0308010C:digital envelope routines::unsupported解决

问题 node 环境 Node.js v18.14.2 使用npm start.出现以下报错 Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object.createHash (node:crypto:133:10) at module.exports (F:\RuoYi-Cloud\CourseSched…

SWAT模型系统学习(建模方法、实例应用、高级进阶)

目前,水环境问题逐渐成为制约社会经济和环境可持续发展的重要因素。根据国内外研究表明,受全球环境变化和经济快速发展的影响,面源污染已逐渐成为水环境污染的第一因素。但面源污染由于具有排放分散、隐蔽,排污随机、不确定、不易…

搜索算法(三) 回溯法

1.回溯法 回溯法可以理解成一种特殊的深度优先算法,比起普通的DFS,多了还原当前节点的一步。 修改当前节点、递归子节点、还原当前节点。 本质是一种试错的思想。 维基百科: 2.例题 1) 力扣https://leetcode.cn/problems/pe…

树莓派安装系统

0. 实验准备 树莓派一个,TF卡(4GB以上)一个,读卡器一个 1. 使用官方提供的工具 在搜索引擎中搜索树莓派(不要用百度,建议使用必应的国际版进行搜索),我这里直接放上树莓派官方超链…

深入篇【Linux】学习必备:理解【Linux软件包管理器】yum + yum的具体使用 + yum下载的有趣指令

这里写目录标题 Ⅰ.Linux软件包管理器yum①.什么是软件包/什么是yum②.linux的软件生态与yum源③.关于rzsz Ⅱ.yum基本指令①.查看软件②.安装软件③.卸载软件 Ⅲ.yum下载的好玩指令①.sl②.linux_logo③.elinks Ⅰ.Linux软件包管理器yum yum 是一个 Shell 前端软件包管理器。基…

C++ 多态 最详细图文+代码讲解

感谢各位 点赞 收藏 评论 三连支持 本文章收录于专栏【C进阶】 ❀希望能对大家有所帮助❀ 本文章由 风君子吖 原创 回顾 上篇文章,我们学习了继承的相关知识,详细解刨了继承中的各种细节,而本章内容将在继承的基础上学习多态 多态的概念…

Dreamweaver如何进行网页开发?

文章目录 0.引言1.安装Dreamweaver2.编写第一个网页 0.引言 笔者本科学习的编程语言主要是关于桌面开发的,对编程有一定的基础,而编程除了关于桌面软件开发(VisualStudio如何进行桌面软件开发?),还有手机应…

网络安全自学笔记+学习路线(超详细)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

c语言编程练习题:7-193 两小时学完C语言

#include <stdio.h> int main(){int n,k,m;int sum;if (scanf("%d %d %d",&n,&k,&m)!EOF){sum n-k*m;}printf("%d",sum);return 0; }

(学习日记)2023.04.28

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

基于SSM的教务管理系统的设计与实现(论文+源码)_kaic

摘 要 学校教务管理信息化是提高办公效率的主要途径。随着中国高等教育的快速发展和学校规模的不断扩大&#xff0c;在校学生人数不断增加&#xff0c;办学层次出现多元化&#xff0c;由一地办学发展到多地多点办学&#xff0c;同时进一步推行学分制。这些变化使得教务部门的管…

【AI绘图】四、stable difusion提示词如何写?

上一篇&#xff1a;【AI绘图】三、stable diffussion操作界面介绍以及如何使用 如何写好提示词&#xff1f; 写出一份比较好的提示词是文生图技术的关键。但是&#xff0c;写出一份好的prompt并不容易&#xff0c;下面针对“如何写好提示词”这个问题&#xff0c;从提示词构成…

MySQL 数据操纵语言 DML

文章目录 数据操纵语言 DMLINSERT 语句UPDATE 语句DELETE 语句 数据操纵语言 DML 数据操纵语言&#xff08;Data Manipulation Language&#xff0c;DML&#xff09;是 SQL 语言的核心部分之一。在添加、更新或者删除表中的数据时&#xff0c;需要执行 DML 语句。很多时候我们提…

Unity导入Android aar包实现交互全流程

一.搭建Android项目 1.创建一个Android空项目 点击finish后,就等待编译,过程中会自动下载一些插件 等待... 等待... 编译完成: 2.创建Module 右键该工程的app,新建一个Module, Language:Kotlin语法和Java语法,语法不同,后续创建的代码文件有所差异,但不影响代码编…

地震勘探基础(六)之地震反褶积

地震反褶积 地震资料常规处理主要包括地震反褶积&#xff0c;水平叠加和偏移成像三大内容。水平叠加可以提高地震资料的信噪比&#xff0c;偏移成像可以提高地震资料的空间分辨率和保真度&#xff0c;地震反褶积可以提高地震资料的分辨率和压制干扰波。 1954年&#xff0c;Ro…

Python心经(5)

目录 python对于类和实例&#xff0c;&#xff0c;都能随时动态绑定 属性或者函数 可以通过__slots__去限定实例所能绑定属性的范围 python里面类很多定制函数__xx__ 下面给个python里面枚举类型 对type函数去实现 有关迭代器&#xff1a; 生成器&#xff1a; 可迭代对…

【Linux编译器gcc/g++】带你了解代码是如何变成可执行程序的!

Linux编辑器gcc/g的使用 背景知识gcc的使用预处理&#xff08;进行宏替换&#xff09;编译(生成汇编)汇编(生成及其可识别代码)链接(生成可执行文件或者库文件)库 动态库vs静态库 debug和release&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x…