当前位置: 首页 > news >正文

图像像素如何排列?是如何存储到diocm里面?读取到内存中是如何存储?

图像像素的排列和存储在DICOM(Digital Imaging and Communications in Medicine,医学数字成像和通信)文件中遵循特定的标准。DICOM 是一种国际标准(ISO 12052),用于处理、存储、打印和传输医学影像信息。

像素排列

在图像中,像素是按照二维网格排列的,每个像素都有一个灰度值或颜色值,表示该位置的亮度或颜色。对于DICOM图像,这个二维网格通常代表一个切片(slice)或者说是三维体积数据的一个二维平面视图。像素从左到右、从上到下依次排列。此外,DICOM 文件可以包含多帧图像,每一帧可以视为独立的二维图像,例如心脏的超声视频中的每一帧。

网格的基本概念

  • 二维矩阵:网格本质上是一个二维矩阵,其中每个元素代表一个像素。这个矩阵的行数和列数定义了图像的宽度和高度。例如,如果一张图像是512x512像素大小,那么它就是由512行和512列组成的网格。

  • 像素位置:每个像素都有其独特的行列坐标,通常从(0, 0)开始,即左上角的第一个像素。随着向右移动,列坐标增加;随着向下移动,行坐标增加。

 

存储到DICOM文件

在DICOM文件中,图像数据被组织为一系列属性(Attribute),这些属性包括但不限于:

  • 患者信息:如姓名、ID等。
  • 研究信息:如研究日期、描述等。
  • 序列信息:如序列名称、参数等。
  • 图像信息:如尺寸、分辨率、像素间距、位深等。
  • 像素数据:这是实际的图像数据,通常以压缩或未压缩的格式存在。

像素数据存储的具体方式取决于几个因素:

  • Bits Stored (位存储):定义了每个像素用多少位来表示。比如8位意味着每个像素有256个可能的灰度值。
  • Pixel Representation (像素表示):确定像素是以无符号整数还是有符号整数形式存储。
  • Photometric Interpretation (光度解释):指定了如何解释像素值,例如单色、RGB等。
  • Planar Configuration (平面配置):对于彩色图像,指定了颜色分量是如何排列的。
  • Compression (压缩):一些DICOM文件使用压缩算法(如JPEG、JPEG-LS、JPEG 2000、RLE等)来减少文件大小。

在DICOM中的实现

  • Rows 和 Columns:在DICOM元数据中,图像的高度(行数)和宽度(列数)分别由RowsColumns属性指定。这两个值共同确定了图像的分辨率以及网格的尺寸。

  • Pixel Spacing:另一个重要的属性是Pixel Spacing,它表示相邻像素之间的物理距离,通常以毫米为单位给出两个值,分别是水平方向和垂直方向上的间距。这有助于准确地解释图像的空间尺度。

  • 多帧图像:对于包含多个相关图像的数据集(如心脏CT扫描的时间序列),每个时间点的图像都构成了一个独立的二维网格。这些网格被串联起来形成一个多维数组,称为多帧图像。

存储方式

  • 光栅顺序:尽管逻辑上像素是以二维网格的形式组织的,但在实际存储时,它们通常按照光栅顺序(raster order)线性化存储,即先存储第一行的所有像素,然后是第二行,依此类推,直到最后一行。对于彩色图像或多通道图像,每个像素的颜色分量也会连续存储。

  • 压缩与编码:为了节省空间并提高传输效率,像素数据可能会被压缩。DICOM支持多种压缩算法,如JPEG、JPEG 2000等。压缩后的数据仍然遵循光栅顺序,但具体的编码方式会影响解码过程中的数据重组。

元数据的重要性

  • 完整描述:除了像素数据本身外,DICOM文件还包含了大量元数据,用于描述图像的各个方面,包括但不限于患者的个人信息、成像设备的技术参数、图像处理的历史记录等。这些信息对于正确解释和使用图像至关重要。

当图像数据被写入DICOM文件时,它会根据上述属性进行编码,并且通常会被打包成一个字节流。如果使用了压缩,那么解码者需要知道并能够执行相应的解压缩算法来恢复原始图像数据。

DICOM文件的结构是一个标签-长度-值(Tag-Length-Value, TLV)格式的序列,其中每个元素都有一个唯一的标签标识它的类型,一个长度指定它的大小,以及一个值域存放实际的数据。像素数据本身通常是文件中最大的一部分,因为它包含了所有构成图像的原始数据。

 

对于单帧图像

  • 灰度图像:像素数据会按行存储,每行的所有像素依次排列。
  • RGB图像:对于彩色图像,每个像素的颜色分量可能会以交错的方式存储,例如 R1 G1 B1 R2 G2 B2 ... 或者以平面分离的方式存储,即所有红色分量之后跟着所有绿色分量,最后是所有蓝色分量。

对于多帧图像(如CT或MRI序列),每一帧图像的数据都按照上述规则进行组织,并且这些帧也会按照特定顺序(通常是时间或空间顺序)存储在DICOM文件中。

此外,DICOM标准还支持压缩格式,如JPEG、JPEG 2000等,这可能会影响像素数据的实际存储方式。压缩后的图像数据将根据所选压缩算法的要求进行编码。

 

读取到内存中是如何存储

无论是灰度图像还是RGB图像,当它们被读取到内存中时,通常也是以线性结构存储的。这是因为计算机内存本质上是一维的地址空间,所有数据都是按照线性顺序存储在内存中的。

然而,在程序中处理这些图像时,开发者通常会使用二维数组(对于灰度图像)或三维数组(对于RGB图像)来表示图像数据,以便更直观地映射到图像的行和列结构。这种抽象使得图像处理操作(如遍历像素、应用滤镜等)更加方便和高效。

具体来说:

  • 灰度图像:在内存中可能以一个一维数组的形式存在,但程序中常常用一个二维数组image[x][y]来访问像素值,其中x是列索引,y是行索引。每个元素代表一个像素的亮度值。

  • RGB图像:同样地,在内存中可能是线性排列的一维数组,但在程序中可能会用一个三维数组image[x][y][c]来表示,其中x是列索引,y是行索引,c是颜色通道索引(0=红色, 1=绿色, 2=蓝色)。这样可以方便地访问每个像素的颜色分量。

许多编程语言和库提供了专门的数据结构来处理图像,例如Python的NumPy库,它允许你将图像数据存储在一个多维数组(ndarray)中,这个数组内部是以线性方式存储的,但是对外提供了一个多维接口来简化图像处理任务。

此外,一些高效的图像处理库(如OpenCV)可能采用特定的优化策略来组织图像数据,例如通过调整颜色通道的顺序(如BGR而不是RGB),或者通过缓存和预取机制来提高性能,但底层数据依然是线性存储的。

总结来说,虽然图像数据在线性内存中是连续存储的,但为了便于处理,编程接口通常会提供一种多维视图来访问这些数据。

图像的像素在内存中的存储方式_图像在内存中的存储方式-CSDN博客文章浏览阅读730次,点赞5次,收藏5次。图像的像素在内存中的存储方式_图像在内存中的存储方式https://blog.csdn.net/wangnaisheng/article/details/140178059

 

相关文章:

图像像素如何排列?是如何存储到diocm里面?读取到内存中是如何存储?

图像像素的排列和存储在DICOM(Digital Imaging and Communications in Medicine,医学数字成像和通信)文件中遵循特定的标准。DICOM 是一种国际标准(ISO 12052),用于处理、存储、打印和传输医学影像信息。 …...

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛,在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺,限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生,它是一种用来将 SDR 源信号转换为 HDR 源信号的技术,可以应用于…...

12.10深度学习_经典神经网络_GoogleNet自我理解

为了更清晰地展示 GoogLeNet 中每个卷积层及其相关参数,我们可以将这些信息整理成表格形式。这不仅有助于理解每一层的输入和输出尺寸,还能直观地看到卷积核的数量、大小、步长以及填充方式等关键参数。以下是 GoogLeNet 前几层(包括两个卷积…...

漫谈 Vercel Serverless 函数

我们需要明白什么是 Serverless。顾名思义,Serverless 并不是没有服务器,而是 “不需要你管理服务器”。就像你去超市买东西,不用自己去种菜、养鸡,直接挑选、付款就好。Vercel 的 Serverless 函数也是类似的,它帮你自…...

Nacos系列:Nacos 控制台手册

引言 Nacos是阿里巴巴中间件部门开源的一款用于服务发现和配置管理的产品,Nacos 控制台主要旨在于增强对于服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力,以便进一步帮助用户降低管理微服务应用架构的成本。 一、访问 Nacos 控制台…...

react-dnd 拖拽事件与输入框的文本选中冲突

问题描述 当我们使用拖拽库的时候,往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点,当拖拽的事件绑定在该元素身上时候,发现子孙的输入框不能进行文本选中了,会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…...

LeetCode:150. 逆波兰表达式求值

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:150. 逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表…...

python中向量指的是什么意思

一、向量是什么 在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度&am…...

7.Vue------$refs与$el详解 ------vue知识积累

$refs 与 $el是什么? 作用是什么? ref,$refs,$el ,三者之间的关系是什么? ref (给元素或者子组件注册引用信息) 就像你要给元素设置样式,就需要先给元素设定一个 class 一样,同理,…...

一个很好的直接网站操作的回测框架

1 网址 https://cn.tradingview.com/...

【电子元器件】贴片电阻的故障现象、故障原理和解决方法

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、故障现象概要 贴片电阻与其他电子元器件相比,虽然属于比较不容易引发故障的零部件,但是在过载或…...

基于Spring Boot + Vue的摄影师分享交流社区的设计与实现

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...

SpringBoot项目监听端口接受数据(Netty版)

文章目录 前言服务端相关配置核心代码 客户端 前言 前言 环境: JDK:64位 Jdk1.8 SpringBoot:2.1.7.RELEASE Netty:4.1.39.Final 功能: 使用Netty监听端口接受客户端的数据,并发送数据给客户端。 服务端 …...

超标量处理器设计笔记(9) 重命名映射表、超标量处理器重命名中相关性问题

寄存器重命名 重命名映射表基于 SRAM 的重命名映射表 超标量处理器的寄存器重命名解决 RAW 相关性解决 WAW 相关性对写 RAT 进行检查(判断哪个 ARF 写入到 RAT)对写 ROB 进行检查(判断) 特殊指令处理方式 重命名映射表 重命名时…...

如何使用 Python 写入文本文件 ?

在Python编程中,写入文本文件是一项基本且重要的操作。 无论是生成日志文件、配置文件,还是进行数据输出,都需要用到这一技能。 下面,我将详细介绍如何使用Python写入文本文件,并提供一些实际开发中的建议和注意事项…...

07篇(附)--仿射变换矩阵

此篇献给某些 头铁 的小只因们,认真钻研下面的数学式吧 原理示例 首先我们以最简单的一个点的旋转为例子,且以最简单的情况举例,令旋转中心为坐标系中心O(0,0),假设有一点P0(x0,y0)&#xff0…...

KubeSphere搭建单节点RocketMQ

前提环境: Docker环境 Harbor仓库(可选) 参考官方文档: 《Docker 部署 RocketMQ》 https://rocketmq.apache.org/zh/docs/quickStart/02quickstartWithDocker参考官方文档: 《RocketMQ Dashboard》 https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard/ 声…...

深度学习中损失函数(loss function)介绍

深度学习中损失函数(loss function)介绍 ​ 在深度学习的宏伟城堡中,损失函数扮演着国王的角色,它决定了模型训练的方向和目标。损失函数,也被称为代价函数,是衡量模型预测与实际结果之间差异的函数。在深度学习的训练过程中&…...

Vue3+Node中使用webrtc推流至mediamtx

前言 项目的 Web 端是 Vue3 框架,后端是 GO 框架。需要实现将客户端的本地摄像头媒体流推送至服务端,而我自己从未有媒体流相关经验,最初 leader 让我尝试通过 RTSP 协议推拉流,我的思路就局限在了 RTSP 方向。 最初使用的服务端…...

React 内置的Hook学习

useState:管理组件状态 useState 是一个用于在函数组件中添加状态的 Hook。它允许你在函数组件中声明一个状态变量,并提供一个更新该状态的方法,其中与组件生命周期的关系: 初始化:当组件首次渲染时,useS…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...