//获取dcm数据结构,一下图像数据仅针对单通道8字节数据
DcmFileFormat fileformat;
OFCondition oc = fileformat.loadFile(dcmPath.c_str()); //读取Dicom图像
if (!oc.good()) //判断Dicom文件是否读取成功
{
std::cout << "file Load error" << std::endl;
errorInfo = "file Load error";
return false;
}
DcmDataset* dataset = fileformat.getDataset();
E_TransferSyntax xfer = dataset->getOriginalXfer(); //得到传输语法

const char* transferSyntax = NULL;
fileformat.getMetaInfo()->findAndGetString(DCM_TransferSyntaxUID, transferSyntax); //获得传输语法字符串
string losslessTransUID = "1.2.840.10008.1.2.4.70";
string lossTransUID = "1.2.840.10008.1.2.4.51";
string losslessP14 = "1.2.840.10008.1.2.4.57";
string lossyP1 = "1.2.840.10008.1.2.4.50";
string lossyRLE = "1.2.840.10008.1.2.5";
if (transferSyntax == losslessTransUID || transferSyntax == lossTransUID || transferSyntax == losslessP14 || transferSyntax == lossyP1)
{
DJDecoderRegistration::registerCodecs();
dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL); //对压缩的图像像素进行解压
DJDecoderRegistration::cleanup();
}
else if (transferSyntax == lossyRLE)
{
DcmRLEDecoderRegistration::registerCodecs();
dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL);
DcmRLEDecoderRegistration::cleanup();
}
else
{
dataset->chooseRepresentation(xfer, NULL);
}

接下去有2种获取帧数据的方法:

1,直接按照索引去数据集数组中获取

DcmElement* element = NULL;
OFCondition result = dataset->findAndGetElement(DCM_PixelData, element); //获取图像数据
if (result.bad() || element == NULL)
return false;
Uint8* image_data = nullptr;
result = element->getUint8Array(image_data); //获取8位的图像数据

//fsIndex 需要获取的图片帧索引

cv::Mat dst(m_height, m_width, CV_8UC1, cv::Scalar::all(0));
unsigned char* data = nullptr;
for (int i = 0; i < m_height; i++)
{
data = dst.ptr<unsigned char>(i);
for (int j = 0; j < m_width; j++)
{
unsigned char pxData = (unsigned char)(image_data[i * m_width + j + fsIndex]);

}

2,转换成图片数据结构再获取每一个像素的值

unsigned short m_width; //获取图像的窗宽高
unsigned short m_height;
dataset->findAndGetUint16(DCM_Rows, m_height);
dataset->findAndGetUint16(DCM_Columns, m_width);

xfer = dataset->getCurrentXfer();     //得到新的传输语法,对于压缩格式的dcm文件读取很重要
DicomImage* m_dcmImage = new DicomImage((DcmObject*)dataset, xfer); //利用dataset生成DicomImage,需要上面的解压方法;

int framecount(m_dcmImage->getFrameCount()); //获取这个文件包含的图像的帧数
int nHeight = m_dcmImage->getHeight();
int nWidth = m_dcmImage->getWidth();
for (int k = 0; k < framecount; k++)
{
unsigned char* pixelData = (unsigned char*)(m_dcmImage->getOutputData(8, k, 0));
cv::Mat dst(nHeight, nWidth, CV_8UC1, cv::Scalar::all(0));
uchar* data = nullptr;

for (int i = 0; i < nHeight; i++)
{
data = dst.ptr<uchar>(i);
for (int j = 0; j < nWidth; j++)
{
data[j] = *(pixelData + i * nWidth + j);
}
}

}

c++ vtdcm对于压缩模式文档图片的读取的更多相关文章

  1. MongoDB,无模式文档型数据库简介

    MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...

  2. 如何通过Java应用程序压缩PDF文档

    PDF文档是我们日常办公中使用最频繁的文档格式.但因为大多数PDF文档都包含很多页面图像或大量图片,这就导致PDF文档过大,处理起来较为麻烦.PDF文件过大,就会导致传输或者下载的速度变慢,也会增加传 ...

  3. PictureCleaner 官方版 v1.1.3.04061,免费的图片校正及漂白专业工具,专业去除文档图片黑底麻点杂色,规格化A4、B5尺寸输出,还你一个清晰的文本。

    当家长多年,每天都要拍照试卷打印.用App去掉图片黑底就成了每天必备工作.可是,有些图片文件不是来自手机,所以需要一个电脑版的图片漂白工具.经过一个多月努力,PictureCleaner官方版诞生了 ...

  4. 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子

    首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  5. 解决Spring的java项目打包后执行出现“无法读取方案文档...“、“原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是...”问题

    问题 一个用Spring建的java项目,在Eclipse或idea中运行正常,为什么打包后运行出现如下错误呢? 2019/07/10/19:04:07 WARN [main] org.springf ...

  6. 【.net 深呼吸】使用二进制格式来压缩XML文档

    在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...

  7. Android打开系统的Document文档图片选择

    打开Document UI 过滤图片 private void startAcitivty() { Intent intent = new Intent(); intent.setAction(&qu ...

  8. 使用itextsharp创建PDF文档——图片集合

    文档管理系统中 ,扫描模块将文档或证件扫描后.为了便于保存多个图片,拟将多个图片生成一个PDF文档进行保存. 这里我们就需要PDF生成工具了.你可以在这里下载.PDFCreator 主要使用了开源工具 ...

  9. NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败

    众所周知,NPOI对xls和xlsx两个版本的excel文档的操作并没有一个统一的支持, 程序若想兼容这两个版本的操作,必须根据excel版本分别去调用HSSF和XSSF这两套操作库, 之前一直不明白 ...

  10. ckeditor粘贴word文档图片的思路

    由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...

随机推荐

  1. 来自StateOfJS调查:2022年JavaScript生态圈趋势报告(前端早读课)

    原文 我这里记录些觉得有趣的. Promise.allSettled() 完成所有输入的方法,no matter what,返回对应的状态和值/原因,这对想知道所有返回状态的业务很好用:使用async ...

  2. NLP学习日记

    数据读取 下载csv文件后使用excel进行转存,然后用pandas读取,再把读取后转为numpy,numpy的tensor里.-1代表数组的最大维度,将原始数据集的标签和特征集分开,便于下一步的处理 ...

  3. springboot gradle 加速问题

    初始化项目使用阿里云 seriver url : https://start.spring.io 直接修改为: https://start.aliyun.com 关键的gradle 修改安装包地址 g ...

  4. debian11 配置samba服务 linuxsys

    一.安装软件包 sudo apt -y install samba samba-common 二.linux系统添加samba需要用的账户,创建需要共享的文件夹,并配置好权限.(注意共享文件夹最好不要 ...

  5. 自定义select组件

    (声明:当前记录篇参考于该人员 https://www.jb51.net/article/166679.htm ) 一.创建组件 1.新建文件夹:select 2.新建Component: selec ...

  6. html的table多级表头表格的代码

    1,两级表头的代码 <html> <head> <title>多层表头</title> <link rel="stylesheet&qu ...

  7. SqlServer 优化的技巧

    1.避免使用 select * select * 不会走覆盖索引,会出现大量的回表操作,从而导致SQL的查询性能很低 2.用union all 代替 union 1.使用union后,可以获取排重复后 ...

  8. Dell CS24-SC 服务器详情

    详情介绍: https://www.viziotech.com/servers/58-dell-cs24-sc-dual-xeon-quad-core-l5420-25ghz-16gb-4x146gb ...

  9. 认识canal

    cancl实现数据库之间的实时同步的工具.通过读取mysql的二进制日志binlog,模拟mysql的slave服务器来工作. 参考链接: https://blog.csdn.net/yehongzh ...

  10. linux安装EMQ

    1.拉取Emqx包 wget https://www.emqx.com/zh/downloads/broker/4.2.14/emqx-centos7-4.2.14-x86_64.rpm 2.安装服务 ...