2016-08-01 6 views
1

ITK 라이브러리를 사용하여 이미지를 등록하고 있습니다. OpenCV로 원본 이미지를 읽은 다음 ITKImage로 변환합니다. 등록 후 결과를 CVMat로 변환하고 imwrite를 사용하여 저장합니다.ITKImageToCVMat가 흰색 이미지를 반환합니다.

그러나 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); 

심지어 등록하지 않고, 그냥 작동하지 않습니다, 다시 변환 한 후, ITKImage에 CVMat에서 이미지를 변환 : 그 다음은

내 코드입니다 ... 너무 이상하다 어떤 생각이있어? 고마워요 :)

답변

1

코드가 거의 잘 작동하지만 두 가지를 고려해야합니다. 하나는 당신의 이미지 유형입니다. 하드 디스크에서 이미지를 읽을 때 픽셀의 값은 "uchar"유형에서 0에서 255 사이이지만 ITK의 이미지는 float 유형 { typedef float PixelType; }으로 정의 했으므로 이미지를 cv :: Mat로 변환하면 여전히 부동 상태입니다 하지만 그 값은 1 이상 (0 ~ 255)이고 "imshow"명령에 대한 float 이미지의 최대 값은 "1"이어야하므로 이미지를 255로 나누면됩니다. imshow("moving image", img3/255);

두 번째 문제는 파일명 : string filename3 = "img3";입니다. 예를 들어 string filename3 = "img3.bmp";

과 같이 저장할 이미지의 형식을 결정해야합니다.