2017-08-08 11 views
0

.dcmイメージをdcmtkフォーマットからopencvに変換する際に問題があります。 マイコード:dicomイメージをopencvに正しく変換する方法

DicomImage dcmImage(in_file.c_str()); 
int depth = dcmImage.getDepth(); 
std::cout << "bit-depth: " << depth << "\n"; //this outputs 10 
Uint8* imgData = (uchar*)dcmImage.getOutputData(depth); 
std::cout << "size: " << dcmImage.getOutputDataSize() << "\n"; //this outputs 226100 
cv::Mat image(int(dcmImage.getWidth()), int(dcmImage.getHeight()), CV_32S, imgData); 
std::cout << dcmImage.getWidth() << " " << dcmImage.getHeight() << "\n"; //this outputs 266 and 425 

imshow("image view", image); //this shows malformed image 

だから私はCV_32SgetOutputDataパラメータについて確認していません。私はそこに何を置くべきですか?また、226100 /(266 * 425)== 2で、2バイト前のピクセル(?)でなければなりません。

答えて

0

getDepth()が10を返すとき、ピクセルあたり10ビット(おそらくグレースケール)

DICOMイメージ(0x0028,0x0103)のピクセル表示に応じて、行列タイプに符号付きまたは符号なし16ビット整数を指定する必要があります。 CV_16UC2またはCV_16SC2。

注意:2バイトの10ビットのみが使用されるため、バッファをマットに渡す前にマスクする必要がある上位6ビットのガーベッジがあります。

更新:あなたのコメントやソースコードについて :DICOMヘッダが、内部の列挙に見られるような

  1. DicomImage :: getInterData():: getPixelRepresentation()は、ピクセル表現を返しません。同時にビット深度と符号付き/符号なしを表現します。ヘッダーの値を取得するには - 私はOpenCVの専門家ではないが、私はあなたが働くことができない16ビットの画像を適切
  2. ビットマスクに8ビットのビットマスクを適用していると思うDcmDatasetまたはDcmFileFormat
  3. を使用して読んでください( 1 >> 11) - 1
+0

あなたの答えをありがとう!私はそれを少し試してみましたが、結果はありませんでした。私はおそらく何かを得ることはありません。私のコード:https://pastebin.com/NGsUn3tN 理由はわかりませんが、表現は0または1(unsined/signed)でなければなりません。また、マスクとして(1 << 11)-1を置くことが正しい選択であるかどうかもわかりません。 Btw:それを行う一般的な方法はありますか?異なる表現/深さの画像が存在する可能性があります。 – user7428910

+0

もう1つ質問:DICOMイメージのピクセル表現をdcmImage.getInterData() - > getRepresentation()として正しく抽出していますか? – user7428910

+0

それに応じて私の答えを更新しました –

0

質問はDicomImage :: getOutputData()を使用すると、DICOM画像から元の画素データが必要な場合、あるいは(もからの回答を参照によって返されるあなたが本当にレンダリングされたピクセルデータを必要とするかどうかであります@kritzel_sw)。 getOutputData()を使用する場合、getDepth()によって返される値ではなく、要求されたビット深度をパラメータ(たとえば、サンプルあたり8ビット)として渡す必要があります。

CT画像で作業する場合は、Hounsfield Units(モダリティLUT変換の結果である符号付き整数値)でピクセルデータを使用します。

関連する問題