c++ vtdcm对于压缩模式文档图片的读取
//获取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对于压缩模式文档图片的读取的更多相关文章
- MongoDB,无模式文档型数据库简介
MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...
- 如何通过Java应用程序压缩PDF文档
PDF文档是我们日常办公中使用最频繁的文档格式.但因为大多数PDF文档都包含很多页面图像或大量图片,这就导致PDF文档过大,处理起来较为麻烦.PDF文件过大,就会导致传输或者下载的速度变慢,也会增加传 ...
- PictureCleaner 官方版 v1.1.3.04061,免费的图片校正及漂白专业工具,专业去除文档图片黑底麻点杂色,规格化A4、B5尺寸输出,还你一个清晰的文本。
当家长多年,每天都要拍照试卷打印.用App去掉图片黑底就成了每天必备工作.可是,有些图片文件不是来自手机,所以需要一个电脑版的图片漂白工具.经过一个多月努力,PictureCleaner官方版诞生了 ...
- 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子
首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 解决Spring的java项目打包后执行出现“无法读取方案文档...“、“原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是...”问题
问题 一个用Spring建的java项目,在Eclipse或idea中运行正常,为什么打包后运行出现如下错误呢? 2019/07/10/19:04:07 WARN [main] org.springf ...
- 【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...
- Android打开系统的Document文档图片选择
打开Document UI 过滤图片 private void startAcitivty() { Intent intent = new Intent(); intent.setAction(&qu ...
- 使用itextsharp创建PDF文档——图片集合
文档管理系统中 ,扫描模块将文档或证件扫描后.为了便于保存多个图片,拟将多个图片生成一个PDF文档进行保存. 这里我们就需要PDF生成工具了.你可以在这里下载.PDFCreator 主要使用了开源工具 ...
- NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败
众所周知,NPOI对xls和xlsx两个版本的excel文档的操作并没有一个统一的支持, 程序若想兼容这两个版本的操作,必须根据excel版本分别去调用HSSF和XSSF这两套操作库, 之前一直不明白 ...
- ckeditor粘贴word文档图片的思路
由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...
随机推荐
- C#开发上位机常用
从深圳回内地几年了,突然想把之前项目中用到的东西做信合集,别忘记了!!!
- Neural Network模型复杂度之Dropout - Python实现
背景介绍 Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 本文从优化参数个数出发, 以dropout技 ...
- COMMON_FUNC_SPLIT_STRING
void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& ...
- const char* str和const char str[]的区别
首先,字符串常量是存储在flash中的.假设字符串常量在flash中的地址是0x8003fb8. 第一种方式,str等价于str的内存单元的地址,str的内存单元存储着字符串常量的地址 第二种方式,s ...
- Java——四种线程创建方式
java中创建线程有四种方式,分别是:继承Thread类,重写run方法,然后创建线程对象并调用start方法.实现Runnable接口,实现run方法,然后创建线程对象并传入Runnable实例,再 ...
- 幻方(4n+2暂时看不懂)
奇数阶幻方 Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下: 把放置在第一行的中间. 顺序将等数放在右上方格中. 当右上方格出界的时候 ...
- 设置NTP校时
设置NTP校时-作为客户端 @echo off rem 以管理员身份执行文件 rem 适用于域控PDC主机,对于未加域的计算机可直接使用Internet时间同步 rem 获取管理员权限 %1 msht ...
- uniapp开发的app打开微信小程序
第一种 <script> export default { data() { return { sweixin: null } }, onLoad() { this.getPlus() } ...
- 【文献阅读】Wigley船在波浪中的运动分析
(1)相关内容 船舶在波浪上运动所受到的外力,主要是流体作用力.这些力的大小和变化与船舶以及流体相对运动有关.一般采用流体动力学方法计算. 船舶在波浪中的运动,根据波浪的形式,分为规则波与不规则波两个 ...
- Jmeter 实现Json格式接口测试
接口Request Headers中的Content-Type和和charset 在"HTTP请求"中添加UTF-8 在"HTTP信息头管理器"中添加Conte ...