将图像的rgb数据转成DICOM医学图像格式

news2024/11/28 19:44:08

dcmtk官方文档:https://support.dcmtk.org/docs/
dcmtk最新源码下载:https://www.dcmtk.org/en/dcmtk/dcmtk-software-development/
dcmtk旧版本源码下载:https://dicom.offis.de/download/dcmtk/

用DCMTK库实现将图像转成dcm格式

dcmtk库的编译这里就不叙述了,网上有很多这方面的详细内容。直接上代码:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmimgle/dcmimage.h"
#include "dcmtk/dcmdata/libi2d/i2djpgs.h"
#include "dcmtk/dcmjpeg/djencode.h"
#include "dcmtk/dcmjpeg/djrplol.h"

using namespace std;
bool ToDicom()
{
	DcmFileFormat dicomfile;
	DcmDataset *dataset = dicomfile.getDataset();

	Uint32 all_len = 0;
	E_TransferSyntax ts = EXS_LittleEndianExplicit;

	cv::Mat mt = cv::imread("test.jpg");
	cv::cvtColor(mt, mt, cv::COLOR_BGR2RGB);

	/*	添加患者信息	*/
	dataset->putAndInsertUint16(DCM_AccessionNumber, 0);
	dataset->putAndInsertString(DCM_PatientName, "李与白", true);
	dataset->putAndInsertString(DCM_PatientID, "201210409217");
	dataset->putAndInsertString(DCM_PatientBirthDate, "19900612");
	dataset->putAndInsertString(DCM_PatientSex, "男");
	dataset->putAndInsertString(DCM_PatientAge, "32");

	dataset->putAndInsertString(DCM_InstitutionName, "四川大学华西医院");
	dataset->putAndInsertString(DCM_InstitutionalDepartmentName, "InstitutionalDepartmentName");

	/*	添加Study信息	*/
	dataset->putAndInsertString(DCM_StudyDate, "StudyDate");
	dataset->putAndInsertString(DCM_StudyTime, "StudyTime");
	dataset->putAndInsertString(DCM_StudyDescription, "StudyDescription");
	char uid[100];
	dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
	dataset->putAndInsertString(DCM_StudyInstanceUID, uid);
	dataset->putAndInsertString(DCM_StudyID, "SF11240921450001");

	/*	添加Series信息	*/
	dataset->putAndInsertString(DCM_SeriesDate, "SeriesDate");
	dataset->putAndInsertString(DCM_SeriesTime, "SeriesTime");
	dataset->putAndInsertString(DCM_SeriesDescription, "SeriesDescription");
	memset(uid, 0, sizeof(char) * 100);
	dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
	dataset->putAndInsertString(DCM_SeriesInstanceUID, uid);

	/*	添加Image信息	*/
	dataset->putAndInsertString(DCM_PlanarConfiguration, "0");
	dataset->putAndInsertString(DCM_ImageType, "ORIGINAL\\PRIMARY\\AXIAL");
	dataset->putAndInsertString(DCM_ContentDate, "ContentDate");
	dataset->putAndInsertString(DCM_ContentTime, "ContentTime");
	dataset->putAndInsertString(DCM_InstanceCreationDate, "20231125");//年月日
	dataset->putAndInsertString(DCM_InstanceCreationTime, "090750");//09:07:50
	dataset->putAndInsertString(DCM_AcquisitionDate, "20231126");
	dataset->putAndInsertString(DCM_AcquisitionTime, "090751");
	dataset->putAndInsertString(DCM_InstanceNumber, "1");
	dataset->putAndInsertString(DCM_PixelSpacing, "0.3\\0.3");
	dataset->putAndInsertString(DCM_WindowCenter, "600"); //源图像的窗位
	dataset->putAndInsertString(DCM_WindowWidth, "800");//源图像的窗宽
	dataset->putAndInsertString(DCM_RescaleIntercept, "0");//灰度偏移
	dataset->putAndInsertString(DCM_RescaleSlope, "1");

	dataset->putAndInsertString(DCM_NumberOfFrames, "1");
	dataset->putAndInsertUint16(DCM_SamplesPerPixel, 3);
	dataset->putAndInsertUint16(DCM_Rows, mt.rows);
	dataset->putAndInsertUint16(DCM_Columns, mt.cols);
	dataset->putAndInsertUint16(DCM_BitsAllocated, 8);
	dataset->putAndInsertUint16(DCM_BitsStored, 8);
	dataset->putAndInsertUint16(DCM_HighBit, 7);
	dataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)mt.data, mt.channels()*mt.total());
	dataset->putAndInsertOFStringArray(DCM_PhotometricInterpretation, "RGB");
	if (dataset->canWriteXfer(ts))
	{
		OFCondition status = dicomfile.saveFile("test.dcm", ts);
		if (status.good())
		{
			std::cout << "save ok" << std::endl;
			return true;
		}
		else
		{
			std::cerr << "Error saving DICOM file: " << status.text() << std::endl;
			return false;
		}
	}
	else
	{
		cout << "can not write" << endl;
		return false;
	}
}

int main()
{
	ToDicom();
	system("pause");
	return 0;
}

代码中用到了opencv图像处理库,主要是方便读取图像数据,而且可以通过opencv将其支持的任何格式转成dcm格式。

如果转换后的dcm图像打不开则可以用dcmdump.exe进行调试:

  1. 进入到dcmdump.exe所在文件夹
  2. 在地址栏输入cmd回车
  3. 在弹出的提示符中输入:

dcmdump.exe d:/test.dcm

然后回车就能看到文件信息
在这里插入图片描述

对未编码的dcm文件进行编码或改变其编码方式

int main()
{
	DJEncoderRegistration::registerCodecs(); // 注册JPEG编解码器
	DcmFileFormat fileformat;
	if (fileformat.loadFile("test.dcm").good())
	{
		DcmDataset *dataset = fileformat.getDataset();
		DcmItem *metaInfo = fileformat.getMetaInfo();

		// 创建数据集的无损JPEG版本
		if (dataset->chooseRepresentation(EXS_JPEGProcess14SV1, NULL).good() && dataset->canWriteXfer(EXS_JPEGProcess14SV1))
		{
			// store in lossless JPEG format
			OFCondition status = fileformat.saveFile("test_jpeg.dcm", EXS_JPEGProcess14SV1);
			if (status.good())
				std::cout << "encode jpeg ok" << std::endl;
			else
				std::cout << "encode jpeg err" << std::endl;
		}
		else
			std::cout << "chooseRepresentation err" << std::endl;
	}
	DJEncoderRegistration::cleanup();
	system("pause");
	return 0;
}

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

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

相关文章

常见面试题-Redis 切片集群以及主节点选举机制

Redis 切片集群了解吗&#xff1f; 答&#xff1a; Redis 切片集群是目前使用比较多的方案&#xff0c;Redis 切面集群支持多个主从集群进行横向扩容&#xff0c;架构如下&#xff1a; 使用切片集群有什么好处&#xff1f; 提升 Redis 读写性能&#xff0c;之前的主从模式中&…

构建强大的接口自动化测试框架:Pytest实践指南!

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架&#xff0c;网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架&#xff0c;因此准备写文章记录一下&#xff0c;做到尽量简单通俗易懂&#xff0c;当然前提是基本的py…

系列二十四、Spring设计模式之策略模式

一、前言 对于我们Java开发人员来说&#xff0c;Spring框架的重要性不言而喻&#xff0c;可以说Java领域之所以发展这么壮大&#xff0c;生态这么丰富&#xff0c;功能这么强大&#xff0c;是离不开Spring以及由其衍生出来的各种子模块的&#xff0c;正是由它们共同奠定了JavaE…

波司登发布2023/24上半财年业绩:稳健高质量增长,旺季业绩可期

11月27日&#xff0c;羽绒服巨头波司登&#xff08;03998.HK&#xff09;正式发布 2023/24上半财年业绩。财报显示&#xff0c;公司营收和净利润连续6年创同期历史新高&#xff0c;经营溢利增速再次快于收入增速。 自2018 年战略转型坚持“聚焦主航道、聚焦主品牌”后&#xf…

前端---JavaScript篇

1. 介绍 JavaScript 是 前端开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 接下来开始详解JavaScript。 2.引入方法 js有两种导入方式&#xff0c;一种是内部脚本&#xff1a;直接在html页面中…

MaskDINO环境搭建与模型测试

1、环境搭建 1、构建虚拟环境安装torch conda create -n mmdetsam python3.8 -y conda activate mmdetsampip install torch1.10.0cu102 torchvision0.11.0cu102 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi…

如何用眼精星票证识别系统识别名片?

近年来&#xff0c;随着信息化技术的不断发展&#xff0c;越来越多的人开始使用电子名片来进行商务交流和信息传递。然而&#xff0c;如何将纸质名片转化为电子名片并结构化数据&#xff0c;却一直是许多人的难题。本文将介绍一种使用眼精星票证识别系统的方法&#xff0c;将纸…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分&#xff0c;每天都要与之互动。 精通Git不仅能简化你的日常操作&#xff0c;还能显著提高生产力。在这篇文章中&#xff0c;我们将探讨一组能够极大提升生产力的命令。 随着对…

波兰边缘计算初创公司获得450w欧元融资

边缘计算社区获悉&#xff0c;近期&#xff0c;波兰边缘计算初创公司CTHINGS.CO 获得450w欧元A轮融资。 以下是官方声明&#xff1a; CTHINGS.CO 获得 2000 万兹罗提&#xff08;约450 万欧元&#xff09;用于国际扩张。此轮融资涉及 ORLEN VC、PKO VC、Freya Capital 和现有投…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道&#xff0c;在一年一度的AWS re:Invent首日&#xff0c;AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统&#xff0c;发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新&#xff0c;以帮助客户在任何规模下分…

【项目实战】SpringBoot连接openGauss

一&#xff1a;Docker安装openGauss 1.下载openGauss 安装好Docker好以后&#xff0c;执行如下命令下载openGauss3.0镜像。docker pull enmotech/opengauss:3.0.0 2.运行openGauss 执行如下命令docker run -itd --name opengauss \ --restartalways \ --privilegedtrue \ …

TLS、对称/非对称加密、CA认证

1. SSL与TLS SSL/TLS是一种密码通信框架&#xff0c;他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码&#xff0c;消息认证码&#xff0c;公钥密码&#xff0c;数字签名&#xff0c;伪随机数生成器等&#xff0c;可以说是密码学中的集大成者。 TLS…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识&#xff0c;可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

苹果手机如何格式化?五个步骤快速掌握!

如果手机出现异常情况&#xff0c;例如运行缓慢、频繁崩溃&#xff0c;又或者想将手机出售、转让给他人&#xff0c;那么将手机格式化可以有助于解决问题。苹果手机如何格式化&#xff1f;本文将为您介绍解决方法&#xff0c;只需要五个步骤就能搞定&#xff0c;帮助您快速掌握…

MES系统数字化看板:生产过程透明化与优化

在当今的制造业中&#xff0c;实现生产过程的透明化和优化已成为企业持续发展的关键。MES系统&#xff08;制造执行系统&#xff09;作为实现这一目标的重要工具&#xff0c;其数字化看板功能在生产现场管理中发挥着越来越重要的作用。 一、MES系统的基本概念与功能 MES系统是…

【算法刷题】Day7

文章目录 283. 移动零1089. 复写零 283. 移动零 原题链接 看到题目&#xff0c;首先看一下题干的要求&#xff0c;是在原数组内进行操作&#xff0c;平切保持非零元素的相对顺序 这个时候我们看到了示例一&#xff1a; [ 0, 1, 0, 3,12 ] 这个时候输出成为了 [ 1, 3, 12, 0, …

Langchain-Chatchat学习

参考&#xff1a;Langchain-Chatchat 阿里通义千问Qwen 保姆级教程 | 次世代知识管理解决方案 - 知乎 (zhihu.com) 中文LLM生态观察 模型 就开源的部分而言&#xff0c;从一开始的MOSS[1] ChatGLM[2] ChatGLM2 [3] 到后来的 baichan [4] 基于LLama2 微调的 中文LLama2 [5] …

ubuntu改window任务栏

经常在ubuntu和win之间切换&#xff0c;任务栏的布局不统一会让人很别扭&#xff0c;个人很喜欢win任务栏的不折叠图标功能&#xff0c;而ubuntu没有&#xff0c;又很喜欢的ubuntu的多工作空间&#xff0c;效率比副屏还高&#xff0c;还可以自定义切换工作空间的快捷键。鱼和熊…

(附源码)基于NET学生信息管理系统-计算机毕设 24077

基于NET学生信息管理系统 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用C#技术建…

第二证券:燃料电池产业进入发展快车道 多家公司披露布局进展

据悉&#xff0c;日前太原钢铁&#xff08;集团&#xff09;有限公司初次开发出超级超纯铁素体TFC22-X连接体材料并结束了批量供货&#xff0c;填补了国内空白。 燃料电池电堆连接体材料是行业中最为要害的战略材料。研发团队打破了特别元素含量精确操控的要害技术瓶颈&#x…