0

C++ で DICOM 画像を読み取り、opencv を使用して操作したいと考えています。

DCMTK を使用して dicom イメージを読み取ることができましたが、それを opencv Mat に変換する方法がわかりません。

以下は私がこれまでに持っているものです:

DicomImage DCM_image("test.dcm");
cv::Mat image(int(DCM_image.getWidth()), int(DCM_image.getHeight()), CV_8U, (uchar*)DCM_image.getOutputData(8));

その結果、次のようになります。

ここに画像の説明を入力

DICOM ビューアでは、次のように表示されます。

ここに画像の説明を入力

正規化後、灰色の画像は次のように表示されます。

ここに画像の説明を入力

どんな助けでも大歓迎です。

4

3 に答える 3

2

私が今見ることができる主な問題は、ピクセル値の範囲 (深さ) の違いです。

CV_8UAFAIK、DICOMはかなり大きな深さ(16ビット)を持つことができ、8ビットしかないに収まろうとしています。DicomImage::getDepth()DicomImageを使用してインスタンスの深さを取得し、画像データを保持する適切な深さで を作成できます。cv::Mat

cv::imshow()使用可能な範囲を最大限に活用するために、データを正規化して、 の表示が期待どおりに見えるようにする必要がある場合もあります。

そう:

  • DCM_imageDicomImage::getDepth()で行う
  • cv::Matデータを保持するのに十分な深さで を作成します
  • 必要に応じてスケーリング
于 2016-04-03T12:35:50.087 に答える
0

モノクロ DICOM 画像で DicomImage::getOutputData() を呼び出す前に、適切な VOI 変換 (ウィンドウの中心と幅など) を選択していることを確認する必要があります。これは、DicomImage::setMinMaxWindow()、DicomImage::setWindow() などによって実行できます。DicomImageクラスのドキュメントを参照してください。

ただし、DicomImage::getOutputData() は常にレンダリングされたピクセル データを返すことに注意してください。つまり、DICOM データセットに保存されている元のピクセル データではありません。

于 2016-04-09T10:38:03.910 に答える