我现在正在与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,然后转换回来,它不起作用....你有什么想法吗?谢谢:))
答案 0 :(得分:1)
你的代码几乎没问题它应该可以工作,但你必须考虑两件事。一个是你的图像类型。当您从硬盘读取图像时,像素的值在“uchar”类型中介于0和255之间,但您在浮点类型{ typedef float PixelType; }
中定义了ITK的图像,因此当您将它们转换回cv :: Mat时,它们'仍然浮动,但它们的值大于1(0~255)并且“imshow”命令的浮动图像的最大值必须为“1”,因此您只需要将图像划分为255:
imshow("moving image", img3/255);
第二个问题是文件名:string filename3 = "img3";
您必须确定要保存的图片格式,例如string filename3 = "img3.bmp";