R 读取DICOM文件时出错:未指定PixelData中的字节数

R 读取DICOM文件时出错:未指定PixelData中的字节数,r,dicom,R,Dicom,我正在使用R中的readdicom文件读取DICOM文件,如下所示: dcmImages <- readDICOMFile("/home/darshil/Downloads/BREBIX/CT10 ponction foie/DEF. VEINEUX - 107205/IM-0001-0001.dcm",debug = TRUE, pixelData = FALSE) 编辑: 我看了源代码。结果表明错误来自readDICOMFile使用的函数parsePixelData。错误是由以下行

我正在使用
R
中的
readdicom文件
读取
DICOM
文件,如下所示:

dcmImages <- readDICOMFile("/home/darshil/Downloads/BREBIX/CT10 ponction foie/DEF. VEINEUX - 107205/IM-0001-0001.dcm",debug = TRUE, pixelData = FALSE)

编辑

我看了源代码。结果表明错误来自
readDICOMFile
使用的函数
parsePixelData
。错误是由以下行引起的:

length <- as.numeric(with(hdr, length[name == "PixelData" & 
            sequence == ""]))
        if (length <= 0) {
            guess <- 1
            stop(paste("Number of bytes in PixelData not specified; guess =", 
                guess))
        }

现在,我该怎么处理呢?因为我使用的是标准文件(上面给出的链接),所以不会引起问题,对吗?

根据DICOM转储的传输语法,图像是封装的,用于图像的压缩是JPEG 2000可逆的(标记0002:0010-TransferSyntaxUID-1.2.840.10008.1.2.4.91)。编码像素数据的封装像素流(本例中为JPEG 2000比特流)被分割成一个或多个片段(项元素-FFFE:E000)。每个ITEM元素传递其自己的显式长度,封装像素流的ITEM序列由分隔符(ITEM delimiter-FFFE:E00D)终止。


封装格式的第一项用于基本抵销表,它可能为空。第二个ITEM元素将包含第一帧的封装像素流。您可以通过比较片段数量(基本偏移量表的项目数量减去1)和多帧封装编码的帧数来检测帧碎片。

根据DICOM转储的传输语法,图像被封装,用于图像的压缩是JPEG 2000可逆的(标记0002:0010-TransferSyntaxUID-1.2.840.10008.1.2.4.91)。编码像素数据的封装像素流(本例中为JPEG 2000位流)被分割为一个或多个片段(项元素-FFFE:E000)。每个项元素传递其自身的显式长度,封装像素流的项序列由分隔符(项分隔符-FFFE:E00D)终止。


封装格式的第一个项目用于基本偏移表,它可能为空。第二个项目元素将包含第一帧的封装像素流。您可以通过比较片段数(基本偏移表的项目数减去一)来检测帧的碎片使用多帧封装编码的帧数。

不幸的是,oro.dicomR软件包无法解压缩dicom文件。还有其他工具可以执行此任务;例如,.I能够使用
dcmdjpeg
命令解压缩dicom文件,然后成功地重新压缩广告在R

library(oro.dicom)

dcmFile <- "images/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile), debug = TRUE)

# system("brew install dcmtk")
cmd <- paste("dcmdjpeg", 
             file.path("~/data", dcmFile), 
             file.path("~/data", sub("images", "images_uncompressed", dcmFile)))
system(cmd)
dcmFile <- "images_uncompressed/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile))
库(oro.dicom)

dcmFile不幸的是,oro.dicomR软件包没有解压dicom文件的能力。还有其他工具可以执行此任务;例如,.I能够使用
dcmdjpeg
命令解压dicom文件,然后在R中成功读取

library(oro.dicom)

dcmFile <- "images/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile), debug = TRUE)

# system("brew install dcmtk")
cmd <- paste("dcmdjpeg", 
             file.path("~/data", dcmFile), 
             file.path("~/data", sub("images", "images_uncompressed", dcmFile)))
system(cmd)
dcmFile <- "images_uncompressed/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile))
库(oro.dicom)

dcmFile我不理解你说的大部分内容。你能告诉我应该尝试哪些方法来获得解决方案吗?例如,我应该在代码中更改/添加什么?并简单解释问题是什么?当在DICOM数据集中压缩图像时,压缩的图像数据不会直接存储在“像素数据”属性中。第一帧是通常存储在第二项(FFFE:E000标记)中,下一帧存储在第三项中,依此类推。用于图像编码的压缩在传输语法属性(标记0002:0010)中指定。在您的情况下,它使用的是无损JPEG2000压缩。您需要JPEG2000解码器来解码压缩流。您所说的大部分内容我都不明白。您能告诉我应该尝试哪些方法来获得解决方案吗?例如,我应该在代码中更改/添加哪些内容?并简单说明问题是什么?当图像被压缩时在DICOM数据集中,压缩图像数据不直接存储在像素数据属性中。第一帧通常存储在第二项(FFFE:E000标记)中,下一帧存储在第三项中,依此类推。用于图像编码的压缩在传输语法属性(标记0002:0010)中指定。在您的情况下,它使用的是无损JPEG2000压缩。您将需要JPEG 2000解码器对压缩流进行解码。
library(oro.dicom)

dcmFile <- "images/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile), debug = TRUE)

# system("brew install dcmtk")
cmd <- paste("dcmdjpeg", 
             file.path("~/data", dcmFile), 
             file.path("~/data", sub("images", "images_uncompressed", dcmFile)))
system(cmd)
dcmFile <- "images_uncompressed/file.dcm"
dcm <- readDICOMFile(file.path("~/data", dcmFile))