私は測光の解釈を持つRLE圧縮DICOMファイルを持っています。 GDCMを使用して、次のコードを使用してフラグメントを取得できます。DICOMファイルのGDCMを使用してLUTを適用してください
gdcm.ImageReader imagereader = new gdcm.ImageReader();
imagereader.SetFileName(fileName);
if (imagereader.Read())
{
DataElement compressedPixelData = imagereader.GetFile().GetDataSet().GetDataElement(Helper.PIXEL_DATA);
SequenceOfFragments sf = compressedPixelData.GetSequenceOfFragments();
if (sf == null) throw new Exception("Cannot get fragments!");
Fragment frag = sf.GetFragment((uint)frameNumber);
uint bufLen = Convert.ToUInt32(frag.GetByteValue().GetLength().toString());
byte[] buffer = new byte[bufLen];
frag.GetByteValue().GetBuffer(buffer, bufLen);
}
バッファからイメージを作成しようとしています。それはPALETTE_COLOR
なので、バッファにLUTを適用する必要があります。私はLUTを適用した後のRGBピクセルを期待するため
gdcm.LookupTable lut = imagereader.GetImage().GetLUT();
int size = ImageWidth * ImageHeight * 3;
byte[] decodedBuffer = new byte[size];
bool worked = lut.Decode(decodedBuffer, (uint)size, buffer, (uint)bufLen);
if (worked)
return decodedBuffer;
else
return buffer;
decodedBufferサイズがWidth * Height * 3
である:私はこのコードを使用します。しかし、結果の画像は正しくありません。
ImageApplyLookupTable
クラスを使用すると、画像を正しく表示できます。
ImageApplyLookupTable
クラスは、画像全体(すべてのフラグメント!)を生のRGBピクセルにデコードし、多くのメモリを消費するため、使用したくありません。フレームごとにフレームをデコードして、メモリ使用量を最小限に抑えたい。
gdcm.LookupTable
クラスを正しく使用して、フレームを一度に正しくデコードする方法を教えてください。私が使用したサンプルファイルはhere.
です。更新:8ビットパレットカラーの場合はImageRegionReader
を使用しましたが、16ビットでは機能しませんでしたが、なぜチェックすることができますか?私は16ビットのサンプルhereを持っています。
あなたは[ExtractImageRegionWithLUT.cs](http://gdcm.sourceforge.net/2.6/html/をチェックする必要がありますExtractImageRegionWithLUT_8cs-example.xhtml) – malat
@malat - 私のアップデートを参照してください、それは8ビットで動作しましたが、16ビットではありません。 – rg11
上記の例では、decodedBuffer配列は適切ではありません。すべての配列値はゼロになります。私は8ビットパレットカラーで作業しています。 – Namrata