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

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:50dataset->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 formatOFCondition status = fileformat.saveFile("test_jpeg.dcm", EXS_JPEGProcess14SV1);if (status.good())std::cout << "encode jpeg ok" << std::endl;elsestd::cout << "encode jpeg err" << std::endl;}elsestd::cout << "chooseRepresentation err" << std::endl;}DJEncoderRegistration::cleanup();system("pause");return 0;
}

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

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

相关文章

三.排序与分页

目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;升序DESC&#xff08;descend&#xff09;降序 ORDER BY 子句在SELECT语句的结尾 2.单列排序 SELECT last_name, job_id, department_id, hire_date FROM e…

Linux(CentOS7)上安装mysql

在CentOS中默认安装有MariaDB&#xff08;MySQL的一个分支&#xff09;&#xff0c;可先移除/卸载MariaDB。 yum remove mariadb // 查看是否存在mariadb rpm -qa|grep -i mariadb // 卸载 mariadb rpm -e --nodeps rpm -qa|grep mariadb yum安装 下载rpm // 5.6版本 wge…

zookeeper集群+kafka集群:

kafka3.0之前依赖于zookeeper。 zookeeper开源&#xff0c;分布式的架构。提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构。 存储和管理数据。分布式节点上的服务接受观察者的注册。一旦分布式节点上的数据发生变化&#xff0c;由zoo…

7、信息收集(2)

文章目录 一、指纹识别1、Nmap工具2、Wafw00f工具 二、使用Maltego进行情报收集 一、指纹识别 1、Nmap工具 命令一&#xff1a;nmap -sS -sV <ip>&#xff0c;使用TCP SYN的方式&#xff0c;扫描目标主机上常规端口运行的服务版本。 -sS&#xff1a;指定使用TCP SYN的方…

k8s中批量处理Pod应用的Job和CronJob控制器介绍

目录 一.Job控制器 1.简介 2.Jobs较完整解释 3.示例演示 4.注意&#xff1a;如上例的话&#xff0c;执行“kubectl delete -f myJob.yaml”就可以将job删掉 二.CronJob&#xff08;简写为cj&#xff09; 1.简介 2.CronJob较完整解释 3.案例演示 4.如上例的话&#xf…

C#,《小白学程序》第三课:类class,类的数组及类数组的排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…

注册Zoho Mail邮箱:优势与使用体验

如何注册Zoho Mail邮箱&#xff1f;要注册Zoho Mail邮箱&#xff0c;首先打开浏览器&#xff0c;访问Zoho Mail官网&#xff0c;点击页面右上角的“创建帐户”按钮。接下来&#xff0c;按照提示输入你的姓名、生日和性别&#xff0c;以及一个有效的手机号码或电子邮件地址。然后…

20231122给RK3399的挖掘机开发板适配Android12

20231122给RK3399的挖掘机开发板适配Android12 2023/11/22 9:30 主要步骤&#xff1a; rootrootrootroot-X99-Turbo:~$ tar --use-compress-programpigz -xvpf rk356x_android12_220722.tgz rootrootrootroot-X99-Turbo:~$ cd rk_android12_220722/ rootrootrootroot-X99-Tur…

【学习记录】从0开始的Linux学习之旅——驱动模块编译与加载

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。本文主要讲述如何编译及加载linux驱动模块。 二、概念及原理 应用程序通过系统调用与内…

(二)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

PHP 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a; 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) <?PHPheader("content-type:text/html;charsetGBK");$ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $sock…

【JavaEE初阶】 HTTP响应报文

文章目录 &#x1f332;序言&#x1f38d;200 OK&#x1f340;404 Not Found&#x1f384;403 Forbidden&#x1f334;405 Method Not Allowed&#x1f38b;500 Internal Server Error&#x1f333;504 Gateway Timeout&#x1f332;302 Move temporarily&#x1f38d;301 Move…

构建智能医患沟通:陪诊小程序开发实战

在医疗科技的浪潮中&#xff0c;陪诊小程序的开发成为改善医患沟通的创新途径之一。本文将介绍如何使用Node.js和Express框架构建一个简单而强大的陪诊小程序&#xff0c;实现患者导诊和医生咨询功能。 1. 安装Node.js和Express 首先确保已安装Node.js&#xff0c;然后使用以…

【机器学习 | 可视化】回归可视化方案

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

【微服务】SaaS云智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

Docker快速搭建RTMP服务(tiangolo/nginx-rtmp:Docker + Nginx+ nginx-rtmp-module)

Linux Docker快速搭建多媒体/视频流的 RTMP 服务 第一步 安装Docker 点击这里查看 第二步 拉取并运行镜像 tiangolo/nginx-rtmp/ docker pull tiangolo/nginx-rtmp docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmpOBS客户端测试 OBS客户端设置直播的推…

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…

LeetCode Hot100 124.二叉树中的最大路径和

题目&#xff1a; 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点…

Linux基本指令总结(二)

1.man指令&#xff08;重要&#xff09; Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: man [选项] 命令 man指令就相当于一个精通linux的专家&#xff0c;你要查询的指令或者函数&…

linux的netstat命令和ss命令

1. 网络状态 State状态LISTENING监听中&#xff0c;服务端需要打开一个socket进行监听&#xff0c;侦听来自远方TCP端口的连接请求ESTABLISHED已连接&#xff0c;代表一个打开的连接&#xff0c;双方可以进行或已经在数据交互了SYN_SENT客户端通过应用程序调用connect发送一个…