2

C++ プロジェクトで DCMTK を使用しており、dicom ファイルからピクセルを取得したいと考えています。この基本的な例を使用しました:

          DicomImage *image = new DicomImage("test.dcm");
          if (image != NULL)
          {
           if (image->getStatus() == EIS_Normal)
          {
            if (image->isMonochrome())
                 {
                     image->setMinMaxWindow();
                     Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 /* bits */));
                    if (pixelData != NULL)
                    {
                    /* do something useful with the pixel data */
                    }
                      }
                  } else
           cerr << "Error: cannot load DICOM image (" <<        DicomImage::getString(image->getStatus()) << ")" << endl;
          }
          delete image;

「ピクセルデータで何か役に立つことをする」セクションで、pixelData変数を使用してピクセルを取得するにはどうすればよいですか

4

1 に答える 1

4

まず第一に、すでにunsigned chars の配列としてピクセル データを持っています。たとえば、それらを 8 ビットのモノクロ ビットマップに転送して、画面に表示することができます。ビットマップを構築するために必要な高さと幅は、DicomImage オブジェクトから取得できます。

ただし、 getOutputData() が選択したメソッドであるかどうかは、「何か役立つ」と考えるものに大きく依存します。これは、getOutputData() が実際には一種のレンダリング メソッドであるためです。典型的な CT、MR、または CR 画像があると仮定すると、グレースケール範囲は既に 8 ビットに再スケーリングされています。

フル グレースケール範囲でピクセル データを抽出し、独自のレンダリングおよび処理方法を適用することをお勧めします。この場合、内部に格納されたピクセル データをフル グレースケール レンジで返す getInterData() を使用することをお勧めします。モダリティ LUT が中間データに適用されているため、得られるのは、デバイスによって測定されたグレースケール値をそれぞれエンコードする値の配列のカプセル化 (クラス DiPixel) です (例: CT の場合のハウンズフィールド単位)。

DiPixel は、これらのグレースケールを void ポインターとして返します。値を正しく処理するには、その表現 (Uint8、Sint16 など) を決定する必要があります。

このアプローチを使用すると明らかに手間がかかりますが、ピクセル データのレンダリングを超えるものについては、元のグレー値を保持する唯一のアプローチです。

于 2016-07-08T06:27:00.113 に答える