1

現在、ITKライブラリで画像登録を行っています。OpenCV でソース イメージを読み取り、ITKImage に変換します。登録後、結果を CVMat に変換し、imwrite を使用して保存します。

ただし、ITKOmageToCVMat は常に白い画像 (imshow で表示) を提供し、imwrite の後、結果はフォルダーに保存されません。それはとても奇妙です...

以下は私のコードです:

cv::Mat img1 = imread(argv[1], IMREAD_GRAYSCALE);
cv::Mat img2 = imread(argv[2], IMREAD_GRAYSCALE);

typedef float  PixelType;
const unsigned int Dimension = 2;
typedef itk::Image< PixelType, Dimension > FixedImageType;
typedef itk::Image< PixelType, Dimension > MovingImageType;
typedef itk::OpenCVImageBridge BridgeType;
FixedImageType::Pointer fixedImage = BridgeType::CVMatToITKImage<FixedImageType>(img1);
MovingImageType::Pointer movingImage = BridgeType::CVMatToITKImage<MovingImageType>(img2);

Mat img3 = itk::OpenCVImageBridge::ITKImageToCVMat<MovingImageType>(movingImage);
display("moving image", img3);
string filename3 = "img3";
imwrite(filename3, img3);

登録しなくても、画像を CVMat から ITKImage に変換してから元に戻すだけでは、うまくいきません.... 心当たりはありますか? ありがとうございました :)

4

1 に答える 1

1

あなたのコードはほとんど問題なく動作するはずですが、2 つのことを考慮する必要があります。1つは画像のタイプです。ハードディスクから画像を読み取るとき、ピクセルの値は「uchar」型で 0 から 255 の間ですが、ITK の画像を float 型{ typedef float PixelType; }で定義したため、それらを cv::Mat に変換し直しても、まだ float です。ただし、それらの値は 1 よりも大きく (0~255)、「imshow」コマンドの float 画像の最大値は「1」でなければならないため、画像を 255 に分割するだけで済みます。 imshow("moving image", img3/255);

2 番目の問題はファイル名です。string filename3 = "img3";次のように、保存する画像の形式を決定する必要が あります。string filename3 = "img3.bmp";

于 2016-12-14T07:51:17.180 に答える