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 があることを示唆しています。