- 浏览: 3448679 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
Howto: Accessing Compressed Data
If compressed DICOM images are loaded, DCMTK most of the time does the job of decompressing the image data itself, e.g. when the user feeds it into the DicomImage
class for visualization or directly calls chooseRepresentation()
to change the transfer syntax. However, sometimes it may be useful to access the original, compressed pixel data of a single- or multi-frame image. This may be the case if the compressed data should be decompressed by an external library (e.g. because DCMTK does not support this kind of compression codec like for MPEG2) or if the data should be decompressed at all since it should be inserted directly into to another file.
For uncompressed pixel data usually this is done very easily by just finding the Pixel Data element in the DICOM dataset by calling DcmItem's findAndGetElement()
routine and then call getUint8Array()
(for example) on the resulting element to access the uncompressed raw pixel data vaules. For compressed data, however, there are some intermediate steps necessary in order to parse the underlying DICOM structures.
The reason is that for compressed data, there is a pseudo-sequence embedded into the Pixel Data element that has to be parsed before actually accessing the compressed data (and individual frames if applicable). The first pseudo-item in that sequence is always the offset table indicating at which byte position each frame actually starts within the following raw data of the Pixel Data element. However, you cannot rely on that table since it may be empty (always empty for MPEG2, for example). Within the next items so-called fragments stored. Usually, one fragment refers to exactly one frame of the image, but that is not a requirement at all. For the rest of the example, at least, this is assumed since this covers 90% of all cases.
In order to access the pixel sequence and the items it is containing, you have to deal with the Pixel Sequence within the Pixel Data element, and that is done using the DcmPixelSequence
class in DCMTK. Here is a full (compiling) example how to accomplish that:
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcpxitem.h" int main(int argc, char *argv[]) { OFCondition result = EC_Normal; /* Load file and get pixel data element */ DcmFileFormat dfile; result = dfile.loadFile("example.dcm"); if (result.bad()) return 1; DcmDataset *data = dfile.getDataset(); if (data == NULL) return 1; DcmElement* element = NULL; result = data->findAndGetElement(DCM_PixelData, element); if (result.bad() || element == NULL) return 1; DcmPixelData *dpix = NULL; dpix = OFstatic_cast(DcmPixelData*, element); /* Since we have compressed data, we must utilize DcmPixelSequence in order to access it in raw format, e. g. for decompressing it with an external library. */ DcmPixelSequence *dseq = NULL; E_TransferSyntax xferSyntax = EXS_Unknown; const DcmRepresentationParameter *rep = NULL; // Find the key that is needed to access the right representation of the data within DCMTK dpix->getOriginalRepresentationKey(xferSyntax, rep); // Access original data representation and get result within pixel sequence result = dpix->getEncapsulatedRepresentation(xferSyntax, rep, dseq); if ( result == EC_Normal ) { DcmPixelItem* pixitem = NULL; // Access first frame (skipping offset table) dseq->getItem(pixitem, 1); if (pixitem == NULL) return 1; Uint8* pixData = NULL; // Get the length of this pixel item (i.e. fragment, i.e. most of the time, the lenght of the frame) Uint32 length = pixitem->getLength(); if (length == 0) return 1; // Finally, get the compressed data for this pixel item result = pixitem->getUint8Array(pixData); // Do something useful with pixData... } if (result.bad()) return 1; else return 0; }
------------------------------------------------------------------
柳北风儿
转载:http://support.dcmtk.org/wiki/dcmtk/howto/accessing-compressed-data
发表评论
-
DCMTK: DcmSCP, error:QueryRetrieveLevel larger remaining bytes
2012-11-06 09:48 3019最近在DcmSCU发送一个findRequest后,DcmSC ... -
DICOM标准(2011)
2012-10-22 10:31 2983DICOM标准(2011) 最新版,下载请看我的百度云网 ... -
DCMTK:wwwapp instalation
2012-10-18 15:55 3318问题 最近按照wwwapp.txt安装work ... -
workList in DCMTK问题总结
2012-10-17 19:37 3581最近正在配置DCMTK中的worklist,因为需要响应C-F ... -
web Server支持 perl
2012-10-17 10:06 3400最近使用DCMTK 安装worklist 需要用到webser ... -
DICOM C-GET vs C-MOVE
2012-10-08 17:01 6625DICOM中C-Get 和C-Move的区别。 C-Move ... -
【最新snapshot】DCMTK3.6.1(MD支持库)安装说明
2012-09-25 16:16 7437【前言】 最近,因为需要开发DICOM ... -
【原创】自定义Appender类,输出DCMTK日志
2012-09-24 10:30 5249就像DCMTK官方论坛说的 ... -
问题:自定义Appender输出DCMTK的oflog
2012-09-24 10:09 2835在我调试DCMTK的DcmNet过程中,发现在Oflog中,D ... -
DCMTK:Receiving Images from PACS using DCMSCU
2012-09-15 14:03 5180通过DCMTK的DCMSCU,从PACS获取图像,看看人 ... -
DCMTK: Set output directory to DcmSCP
2012-09-18 09:16 4558Author Message -
DCMTK:DCMSCU get series
2012-09-15 14:02 2782Author Message mano ... -
DCMTK DCMSCU例子
2012-09-15 14:01 5792转载:http://forum.dcmtk.org/viewt ... -
DCMTK DCMScu和DCMScp 细节讨论
2012-09-15 14:04 14419PACS connection Moderator: ... -
DCMTK Howto: User Identity Negotiation
2012-09-18 09:16 6180Howto: User Identity Negotia ... -
DCMTK:howto:dcmscu-example 网络客户端
2012-09-15 14:00 4349DcmSCU example program Th ... -
DCMTK Create a Mammography CAD SR Document
2012-09-18 09:17 2785Howto: Create a Mammography ... -
DCMTK create GSPS object with multiple image references
2012-09-18 09:17 3013Howto: Create GSPS object wi ... -
DCMTK提取Overlay Data
2012-09-14 14:07 4258Howto: Extract Overlay Data ... -
DCMTK读取多帧图像,不需要全部读取像素数据,即可处理数据
2012-09-14 14:06 5668Howto: Access multi-frame im ...
相关推荐
DICOM图像数据通常以像素数组的形式存储,可以通过`PixelData`元素获取。然后,我们可以使用`PixelUtil`类将这些数据转换为常见的图像格式: ```java byte[] pixelData = ds.getPixelData().toByteArray(); ...
DcmPixelData* pixelData = (DcmPixelData*)dataset->findAndGetSequenceOfItems(DCM_PixelData); Uint16* pixelBuffer = NULL; unsigned long numberOfFrames = 0; if (pixelData && pixelData->getUint16Array(&...
7. **DICOM数据解析**: 学习和理解DICOM数据,需要掌握如何解析其数据结构,包括解析DICOM Header(头部信息)和Pixel Data(像素数据)。Header中的信息帮助我们理解图像的来源、类型以及扫描参数,而Pixel Data则...
- 对于像素数据(Pixel Data),由于其通常非常大,可能需要特殊处理,例如使用`DcmPixelData::getUint8Array()`获取像素值。 5. 处理像素数据: DICOM中的像素数据可以是多种编码格式,如未压缩的灰度或RGB图像...
另一部分是Pixel Data(像素数据),存储实际的图像信息。Header 中的数据按照 DICOM 标准规定的数据元素(Element)进行组织,每个元素都有一个特定的标签(Tag)和对应的值。 2. **DICOM Header**:Header 包含了...
在 DICOM 格式中,每个文件都由多个部分组成,包括一个文件头(Header)和数据体(Pixel Data)。文件头包含了 DICOM 元数据,这些元数据以 Tag 的形式存在,Tag 是一个16位的标识符,用于定义数据元素的类型。例如...
理解DICOM格式是处理此类图像的基础,包括其文件结构、数据元素(如Pixel Data、Patient Information等)以及编码方式(如JPEG、RLE等)。 MFC是微软提供的一个面向对象的C++库,它简化了Windows应用程序开发,提供...
在实际应用中,C#开发者可能需要编写代码来解析DCM文件的各个部分,如DIR(DICOM Information Repository)用于存储患者和研究信息,而Pixel Data元素则包含了实际的图像像素值。理解DICOM文件结构和编码方式(如...
3. **像素数据(Pixel Data)**:DICOM图像的像素数据通常经过压缩存储,常见的压缩算法有JPEG、RLE(Run Length Encoding)等。理解像素数据的解码过程对于正确显示图像至关重要。 4. **元数据(Metadata)**:...
2. **像素数据(Pixel Data)**:文件中的图像数据部分,通常编码为灰度或颜色像素的数组。DICOM支持多种压缩算法,如JPEG、RLE(Run Length Encoding)和JPEG 2000,这些压缩方式会影响像素数据的存储方式和大小。 ...
以及一个数据体(Pixel Data),存储了实际的医学影像。 2. **DICOM 格式编码**:DICOM 文件可以采用多种编码方式,如灰度图像编码、JPEG 压缩、RLE(Run-Length Encoding)等,以适应不同的影像质量和传输速度需求...
1. DICOM解析:首先,你需要了解DICOM文件的结构,包括它的头信息(Header)和像素数据(Pixel Data)。DICOM头信息包含了许多重要的元数据,如图像尺寸、像素间距、色彩空间等。解析这些信息是转换的第一步。 2. ...
关于"读取DICOM文件",这涉及到理解DICOM文件结构,包括文件头(Header)、像素数据(Pixel Data)以及一系列的DICOM元素(Elements),每个元素都有一个特定的Tag,如(0008,0020) - Study Date, (0008,0030) - ...
3. **Pixel Data**:图像的实际像素数据,根据不同的压缩算法(如JPEG、RLE、未压缩等)以二进制形式存储。 4. **Transfer Syntax**:DICOM文件可以使用多种传输语法,比如JPEG、PNG、未压缩等,决定了数据如何在...
1. **DICOM结构**:了解DICOM文件的结构至关重要,包括元数据(Header)和图像数据(Pixel Data)。元数据包含了关于图像的临床信息,如患者信息、设备信息、扫描参数等;像素数据则存储实际的图像内容。 2. **...
DICOM数据通常以DICOM文件的形式存在,这些文件遵循特定的文件格式,其中包括DICOM头(Header)和像素数据(Pixel Data)。头部信息以一系列称为DICOM元素(DICOM Tags)的形式存储,每个元素都有一个唯一的16位标签...
3. **图像数据**:DICOM图像数据存储在Pixel Data(0x7fe0,0x0010)字段,可以是未压缩的原始像素值,也可以是经过JPEG、RLE或其它压缩算法压缩的数据。解码这部分数据以得到实际图像,需要根据DICOM文件的压缩编码...