//获取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. Timer VS DispatcherTimer

    Timer是在ThreadPool线程池中执行的,每当计时器到期时,就会创建一个线程来执行事件处理程序.这种实现方式可能会导致一些问题,例如计时器事件处理程序可能会与主线程竞争资源,从而导致性能问题. ...

  2. enzyme文档

    Enzyme是一个用于React的JavaScript测试实用程序,它使得更容易断言,操作和遍历您的React组件的输出,它模拟了jQuery的API,非常直观,易于使用和学习. 整理相当API为中文 ...

  3. python_test_5001_Moudle_pandas

    import pandas as pd import numpy as np from lib_001_decorator_log_funcname import decorator_log_func ...

  4. 统信系统部署es

    rpm -ivh jdk-17.0.4.1_linux-x64_bin.rpm groupadd es && useradd -d /home/es -g es estar -xzvf ...

  5. Vue + Element table中的某行触发enter事件后,使该行disabled

    废话不罗嗦,上硬菜. 1.html下: <el-table-column label="名称" sortable> <template slot-scope=&q ...

  6. python的GIL全局解释器锁

    global interpreter lock -- 全局解释器锁 CPython 解释器所采用的一种机制,它确保同一时刻只有一个线程在执行 Python bytecode.此机制通过设置对象模型(包 ...

  7. 【Windows】Windows11 安卓子系统安装方法与使用技巧

    安卓子系统 (Windows Subsystem For Android, WSA) 可以说是 Windows11 的最强功能,能在 Windows 系统中体验各种安卓应用.但是有些电脑可能不符合硬件 ...

  8. download links

    1 anaconda https://mirrors.bfsu.edu.cn/anaconda/archive/

  9. 简单记录五个Linux设置定时任务的步骤(自动化运维必备)

    这几天我们国庆节休息,但是作为运维工作的同学们是不是也不能闲着,担心工作中是不是有任务在执行中需要维护.于是,我们很多的运维工作都是用的自动化运维监控,如果有故障都会定时的处理和告警的.这个与我们的L ...

  10. vue - 解决页面跳转到外部链接后,ios回退到本页面,生命周期,路由导航守卫钩子都无法触发的问题

    虽然加班,最近心情还是可以的,没多少bug找上门. 乐级生悲,遇到了个奇葩的坑,花了点时间百度才解决...但我离不开的'板砖'是安卓的,对此坑是抗拒的,完全没问题... #此坑描述 ...订单详情某按 ...