可能是糟糕的dicom图像情节的原因

时间:2014-09-13 03:46:56

标签: r rgb dicom

这种常见X射线的dicom文件以混乱的方式绘制的原因可能是什么:

enter image description here

使用的算法如下:

原始图像矩阵是3d:

int [1:2014, 1:2014, 1:3] 110 51 99 113 52 101 111 53 102 110 ...

此rgb通过公式转换为灰度:

gray = 0.3*mat[,,1] + 0.59*mat[,,2] + 0.11*mat[,,3] ; 

然后在将颜色指定为:

之后绘制
grey(0:64/64)

哪里可能是错误?

我在R中使用了带有函数的oro.dicom包:

jj = readDICOMFile(fname, endian = "little", flipud = TRUE, DICM = TRUE, skipSequence = FALSE, pixelData = TRUE, warn = -1, debug = FALSE) 

并返回矩阵jj $ img,其结构为:

int [1:2014, 1:2014, 1:3] 110 51.... 

然后我将其转换为灰色并绘制它。如果它是rgba,矩阵将是2014 * 2014 * 4而不是* 3。 dicom图像的标题提及" PhotometricInterpretation" as" RGB"。标题还提到了行和列,分别为2014年。它可能与位问题有关:leadtools.com/sdk/medical/dicom-spec17.htm

编辑:分配的位数为8,存储的位数为8,highBit为7。

以下是样本dicom图像的链接,该图像具有相似的图像矩阵并给出类似的错误:http://www.barre.nom.fr/medical/samples/files/US-RGB-8-esopecho.gz

1 个答案:

答案 0 :(得分:3)

readDICOMFile可能有错误。您可以通过重新排列图像数组来修复:

jj = readDICOMFile(fname, flipud = FALSE, DICM = TRUE, skipSequence = FALSE, pixelData = TRUE, warn = -1, debug = FALSE)
img <- jj$img # extract image part
img <- aperm(array(c(aperm(img, c(2, 1, 3))), c(3, 256, 120)), c(3, 2, 1)) # rearrange dimension
img <- img[120:1,,] # flip ud
grid::grid.raster(scales::rescale(img))

enter image description here


<强>更新

readDICOMFile还有另一个错误。这就是你想要的。 您可能最好向oro.dicom的作者报告此事。

img <- jj$img # extract image part
img <- aperm(array(c(aperm(img, c(2, 1, 3))), c(3, 256, 120)), c(3, 2, 1)) # rearrange dimension

# conversion b/w unsigned and signed
img <- ifelse(img > 0, img, 256+img)

# window-ing
wc <- 127
ww <- 255

ymin <- 0
ymax <- 1

img2 <- ifelse(img <= wc - 0.5 - (ww-1)/2, ymin, 
               ifelse(img > wc - 0.5 + (ww-1)/2, ymax,
                      ((img - (wc - 0.5)) / (ww - 1) + 0.5) * (ymax - ymin) + ymin
                      ))

grid::grid.raster(img2)

enter image description here