如何在Python中使用带有gdcm的DICOM LUT解码器 - 传递缓冲区

时间:2015-08-13 20:27:31

标签: python c++ dicom gdcm

我需要使用GDCM将DICOM图像转换为PNG格式。虽然this example有效,但似乎并未将LUT考虑​​在内,因此我得到了倒置/非倒置图像的混合。虽然我熟悉C ++和Python,但我无法掌握包装内的黑魔法。文档纯粹是用C ++编写的,我需要一些帮助来连接点。

主要任务

转换示例中的以下部分:

def gdcm_to_numpy(image):
    ....
    gdcm_array = image.GetBuffer()
    result = numpy.frombuffer(gdcm_array, dtype=dtype)
    ....

这样的事情:

def gdcm_to_numpy(image):
    ....
    gdcm_array = image.GetBuffer()
    lut = image.GetLUT()
    gdcm_decoded = lut.Decode(gdcm_array)
    result = numpy.frombuffer(gdcm_decoded, dtype=dtype)
    ....

现在这给出了错误:

NotImplementedError: Wrong number or type of arguments for overloaded function 'LookupTable_Decode'.
  Possible C/C++ prototypes are:
    gdcm::LookupTable::Decode(std::istream &,std::ostream &) const
    gdcm::LookupTable::Decode(char *,size_t,char const *,size_t) const

从查看GetBuffer定义,我猜第一个参数是指定的变量bool GetBuffer(char *buffer) const;。我想后一个4参数版本是我应该瞄准的版本。不幸的是,我不知道size_t参数应该是什么。我试过

gdcm_in_size = sys.getsizeof(gdcm_array)
gdcm_out_size = sys.getsizeof(gdcm_array)*3
gdcm_decoded = lut.Decode(gdcm_out_size, gdcm_array, gdcm_in_size) 

gdcm_in_size = ctypes.sizeof(gdcm_array)
gdcm_out_size = ctypes.sizeof(gdcm_array)*3
gdcm_decoded = lut.Decode(gdcm_out_size, gdcm_array, gdcm_in_size) 

但没有成功。

更新 - 根据@ malat的建议使用ImageApplyLookupTable进行测试

...
lutfilt = gdcm.ImageApplyLookupTable();
lutfilt.SetInput( image );
if (not lutfilt.Apply()):
    print("Failed to apply LUT")

gdcm_decoded = lutfilt.GetOutputAsPixmap()\
    .GetBuffer()

dtype = get_numpy_array_type(pf)
result = numpy.frombuffer(gdcm_decoded, dtype=dtype)
...

不幸的是我得到了#34;无法应用LUT"打印,图像仍然反转。看到下图,ImageJ建议它有一个反相LUT。

Comarison of the two images

1 个答案:

答案 0 :(得分:1)

作为一个简单的解决方案,我会先应用LUT。在这种情况下,您需要使用ImageApplyLookupTable。它在内部调用gdcm :: LookupTable API。请参阅example

当然,正确的解决方案是通过DICOM LUT并将其转换为PNG LUT。

更新:现在你已经发布了截图。我理解你身边发生的事情。您没有尝试应用DICOM查找表,而是尝试更改两个不同的Photometric Interpration DICOM DataSet的渲染,即MONOCHROME1与MONOCHROME2。

在这种情况下,您可以通过使用:gdcm.ImageChangePhotometricInterpretation使用软件实现来更改它。从技术上讲,这种渲染最好使用你的图形卡(但这是一个不同的故事)。