Matlab-写入mhd和raw医学图像处理格式文件

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

mhd和raw是什么?

       MHD(MetaImage)和RAW(Raw Image Data)是用于医学图像处理和分析的常见文件格式之一。

  1. MHD (MetaImage) 文件格式

    • 描述:MHD 文件是一种元数据文件,用于描述与医学图像相关的数据。通常与 RAW 格式文件一起使用,MHD 文件包含有关图像数据的元信息,如图像尺寸、像素类型、数据间隔等。
    • 特点:MHD 文件不存储图像本身的像素数据,而是提供关于数据的描述信息。
    • 元信息:MHD 文件通常包含有关图像的描述信息,例如像素类型(如无符号字节型、有符号字节型、无符号短整型、有符号短整型等)、像素尺寸(如宽度、高度、深度)、数据间隔(指数据在内存中的存储方式)等。
    • 扩展名:通常的 MHD 文件扩展名为 .mhd。
  2. RAW (Raw Image Data) 文件格式

    • 描述:RAW 文件是包含原始像素数据的文件格式,通常不包含任何元信息或者包含极少的元信息。
    • 特点:RAW 文件通常存储医学图像的原始像素数据,这些数据未经过处理或解码。
    • 像素数据:RAW 文件包含图像的原始像素数据,通常以二进制形式存储。这些数据可能是未经过任何压缩或编码的原始数据。
    • 用途:通常需要与 MHD 文件一起使用,通过 MHD 文件提供的元信息,可以解释 RAW 文件中的原始像素数据。
    • 扩展名:RAW 文件可以使用各种扩展名,如 .raw、.bin、.dat 等。

       在医学图像处理中,通常使用 MHD 文件来描述图像的属性和结构,而使用 RAW 文件来存储图像的原始像素数据。这种结合使得图像处理软件能够准确解释图像数据,并进行进一步的处理、分析或可视化。

Matlab代码

% 写入Mhd和Raw文件
function writeMhdAndRaw(filename, data, element_spacing, data_type)
% 创建mhd和raw
mhd = strcat(filename, '.mhd');
raw = strcat(filename, '.raw');
% 写入mhd文件
fid = fopen(mhd, 'w');
assert(fid > 0, 'Open MHD File Error.');
% 类型
fprintf(fid, 'ObjectType = Image\n');
% 维度
fprintf(fid, 'NDims = %d\n', ndims(data));
% 不同维度的尺寸和元素间距
dims = ndims(data);
if(dims == 2)fprintf(fid, 'DimSize = %d %d \n', size(data,1), size(data,2));fprintf(fid, 'ElementSpacing = %1.4f %1.4f\n', element_spacing(1), element_spacing(2));
elseif(dims == 3)fprintf(fid, 'DimSize = %d %d %d\n', size(data,1), size(data,2), size(data,3));fprintf(fid, 'ElementSpacing = %1.4f %1.4f %1.4f\n', element_spacing(1), element_spacing(2), element_spacing(3));
elseif(dims == 4)fprintf(fid, 'DimSize = %d %d %d %d\n', size(data,1), size(data,2), size(data,3), size(data,4));fprintf(fid, 'ElementSpacing = %1.4f %1.4f %1.4f %1.4f\n', element_spacing(1), element_spacing(2), element_spacing(3), element_spacing(4));
end
% 数据类型
if(strcmp(data_type,'char') || strcmp(data_type,'uint8'))fprintf(fid, 'ElementType = MET_UCHAR\n');
elseif(strcmp(data_type,'short'))fprintf(fid, 'ElementType = MET_SHORT\n');
elseif(strcmp(data_type,'float32'))fprintf(fid, 'ElementType = MET_FLOAT\n');
end
% 元素字节顺序
% MSB(又名big-endian)排序在SPARC和摩托罗拉处理器(例如Macintoshes)中很常见。
% LSB(又名little-endian)排序在英特尔处理器(例如PC兼容机)中很常见。
fprintf(fid, 'ElementByteOrderMSB = False\n');
% 设置raw文件
fprintf(fid, 'ElementDataFile = %s\n', raw);
% 关闭mhd
fclose(fid);
% 写入raw文件
fid = fopen(raw, 'w');
assert(fid > 0, 'Open RAW File Error.');
% 写入数据
fwrite(fid, data, data_type);
% 关闭raw
fclose(fid);
end

测试代码

       测试功能就是将test.mat中的图像矩阵A1,保存为mhd和raw格式,并用ImageJ软件加载测试。

% 加载mat文件
load('test.mat'); 
filename = 'test';
image_data = int16(A1); 
element_spacing = [1, 1];
data_type = 'short';
% 调用函数
writeMhdAndRaw(filename, image_data, element_spacing, data_type);

测试数据地址:

链接:https://pan.baidu.com/s/1xkR1lfDrCYoGYsfBXRDMIA 
提取码:p0s6 

测试效果     

源数据:

ImageJ加载保存的mhd文件:

       ImageJ中宽高对应matlab中的行列,所以显示效果是转置的。因为我刚开始用ImageJ,也可能是我没配置好,如果有问题烦请指出。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

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

相关文章

kubernetes-networkpolicies网络策略问题

kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点,查看我的博客CKA考题,里面能找到解决方法 1.部署prometheus监控的时候,都部署成功,但是web访问503-504超时 2.添加ingress的时候也是访问不到,其他命…

HarmonyOS实战开发-如何实现一个简单的电子相册应用开发

介绍 本篇Codelab介绍了如何实现一个简单的电子相册应用的开发,主要功能包括: 实现首页顶部的轮播效果。实现页面跳转时共享元素的转场动画效果。实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 Swiper:滑块视图容…

Eclipse新建java类的操作流程

一、在左侧空白区域,点击鼠标右键。 二、点击new,选择Java Project (由于这里不知道怎么截图,就用手机拍了一张,希望不要介意) 三、 给project文件起个名字,其他都不用管,点击Finis…

YoloV8实战:使用YoloV8检测钢材表面缺陷

摘要 本文讲解一下实战,使用YoloV8检测钢材表面缺陷。起因是有粉丝搞不定这个数据集,检测的时候出现了不收敛的情况。所以,给大家讲讲如何去做。 不收敛的原因 一般遇到不收敛的情况,就是数据转化的时候出错了,大家可以打开runs下面的训练日志,观察一下是否正常。 如…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图:图G由顶点集V和边集E组成,记为G (V, E),其中V(G)表示图G中顶点的有限非空集;E(G) 表示图G中顶点之间的关系(边)集合。若V {v1, v2, … , vn},则用|V|…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所…

Java 扫描某包下所有类的注解并获得注解值

背景 : 需求 需要获取某个包下的所有的注解 并不是全部项目的 所以 只用针对某个包 进行扫描 获取注解 数据就行 百度了一圈 spring boot 没有自带的 获取注解集合的方法 在看 php 中 hyperf 框架 看到了 这个方法 就是因为 我需求是 php 和java 合体 微服务开发 …

华为云亮相KubeCon EU 2024,以持续开源创新开启智能时代

3月21日,在巴黎举办的云原生顶级峰会KubeCon EU 2024上 ,华为云首席架构师顾炯炯在“Cloud Native x AI:以持续开源创新开启智能时代”的主题演讲中指出,云原生和AI技术的融合,是推动产业深刻变革的关键所在。华为云将…

GAMES Webinar 288-VR/AR专题-陆峰-混合现实中的多模态自然人机交互

感知交互增强智能 研究室虚拟现实技术与系统国家重点实验室,北京航空航天大学计算医学研究所,大数据精准医疗北京市高精尖创新中心 Perception & Hybrid Interaction (PHI) for Augmented & Affective Intelligence (A2I) We are working on v…

【微服务】Gateway

文章目录 1.基本介绍官方文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter1.引出网关2.使用网关服务架构图3.Gateway网络拓扑图(背下来)4.Gateway特性5.Gateway核心组件1.基本介绍2.断言3.过滤 6.Gateway工作机制 2.搭建Gat…

FastAPI+React全栈开发08 安装MongoDB

Chapter02 Setting Up the Document Store with MongoDB 08 Installing MongoDB and friends FastAPIReact全栈开发08 安装MongoDB The MongoDB ecosystem is composed of different pieces of software, and I remember that when I was starting to play with it, there w…

fzf 命令行工具 - 终端模糊搜索

1. 介绍 fzf 命令行工具 Github 仓库:GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder fzf 是一款使用 go 语言编写的交互式命令行工具,有着 “命令行模糊搜索神器” 的美称 可以用于文件列表、历史命令、命令输出结果等模糊搜索…

kubernetes(K8S)学习(七):K8S之系统核心组件

K8S之系统核心组件 K8s系统核心组件1.1 Master和Node1.2 kubeadm1.3 先把核心组件总体过一遍1.4 Kubernetes源码查看方式1.5 kubectl1.6 API Server1.7 集群安全机制之API Server1.8 Scheduler1.9 kubelet1.10 kube-proxy K8s系统核心组件 1.1 Master和Node 官网 :…

Java虚拟机(JVM)知识点总结

一. Java内存区域 1. JVM的内存区域划分,以及各部分的作用 可分为运行时数据区域和本地内存,按照线程私有和线程共享分类: 线程私有:程序计数器、虚拟机栈、本地方法栈。 线程共享:堆、方法区、直接内存。 JDK1.7…

vant2调用Dialog、Toast报错 is not defined

报错 ReferenceError: Dialog is not defined 照着官方文档,运行会报错 经过测试发现 main.js并不需要引入Dialog,而是在具体组件中单独引入即可,确实挺坑的!记录一下!!!

SpringBoot实现RabbitMQ延迟队列

RabbitMQ实现延迟队列的两种方式 利用RabbitMQ插件方式实现延迟队列利用RabbitMQ死信队列实现延迟队列 插件方式实现延迟队列 下载插件:Community Plugins | RabbitMQ 按照官网步骤安装插件 installing Additional Plugins | RabbitMQ 插件方式实现延迟队列&a…

element-ui-plus el-tree 树形结构如何自定义内容

element-ui-plus el-tree 树形结构如何自定义内容 本文提及的 elementUI 版本 为 elementUI Plus 版本 一、需求 项目中遇到一个需要设置权限的地方,但目录和权限是放在一起的,这样就很不好区分类别,为了区分类别,就需要自定义树…

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2(演示对齐规则1、2、3、4) 2、为什么存在内存对齐 2.1、平台原因(移植原因) 2.2、性能原因 2.3、那么如何即满足对齐,又要节省空间呢? …

【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心

reactiveEffect.ts:Vue 3响应式系统的核心 1. 什么是 reactiveEffect?2. 核心机制2.1 依赖收集(Track)2.2 触发更新(Trigger)2.3 效果范围(effectScope) 3. 源码解析 —— track3.1 …

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络,这里面首先是…