0

DICOM 画像を PNG 形式に変換するには、 GDCMを使用する必要があります。この例は機能しますが、 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 定義を見ると、最初のパラメーターは割り当てられた variable だと思います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) 

しかし、成功しませんでした。

更新 - ImageApplyLookupTable@malat の提案に従ってテストします

...
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)
...

残念ながら、「LUT の適用に失敗しました」と印刷され、画像はまだ反転しています。下の画像を参照してください。ImageJ は、反転 LUT があることを示唆しています。

2 つの画像の比較

4

1 に答える 1