[英]Access to pixel values of a tif image using ITK
我是ITK的新手,我正尝试使用ITK读取tif文件并访问其像素。 这是我用于此目的的代码片段:
typedef float PixelType; // Pixel type
const unsigned char Dimension = 2;
typedef itk::Image< PixelType, Dimension > ImageType;
ImageType::Pointer image;
typedef itk::ImageFileReader< ImageType > ReaderType;
ReaderType::Pointer reader;
reader = ReaderType::New();
const char * filename = "test.tif";
reader->SetImageIO(itk::TIFFImageIO::New());
reader->SetFileName(filename);
try
{
reader->Update();
}
catch (itk::ExceptionObject & excp)
{
std::cerr << excp << std::endl;
}
// Access to a pixel
ImageType::IndexType pixelIndex;
pixelIndex[0] = 103;
pixelIndex[1] = 178;
ImageType::PixelType pixelValue = image->GetPixel(pixelIndex);
std::cout << "pixel : " << pixelValue << std::endl;
我得到的像素值与正确值不匹配! 我已经使用MATLAB检查我的测试图像。 其尺寸如下:<298x237x4 uint8>。
我尝试使用MATLAB将image(:,:,1)(即<298x237 uint8>)存储为新的tif图像,然后将此图像作为输入图像传递给上述程序。 它正在工作,并且我获得了预期的正确像素值!
我有点知道问题出在哪里,但我不知道如何解决。 我不知道如何修改程序以从<298x237x4 uint8>输入图像中提取<298x237 uint8>图像。
更新:
这是我从tiffinfo获得的信息:
您的文件包含RGBA像素,但是您正在将它们读取为仅浮点型的图像。
快速的解决方案是只更改此typedef:
typedef float PixelType; // Pixel type
至:
typedef itk::RGBAPixel<float> PixelType; // Pixel type
使用ITK,当您指定ImageFileReader时,您正在指定要作为输出的类型。 ITK将隐式地转换为您所请求的类型。 在您的情况下,您需要从RGBA转换为float。
通过直接构造ImageIO,您可以从文件中获取像素类型信息。 这是Wiki示例的一个示例:
std::string inputFilename = argv[1];
typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
itk::ImageIOBase::Pointer imageIO =
itk::ImageIOFactory::CreateImageIO(
inputFilename.c_str(), itk::ImageIOFactory::ReadMode);
imageIO->SetFileName(inputFilename);
imageIO->ReadImageInformation();
const ScalarPixelType pixelType = imageIO->GetComponentType();
std::cout << "Pixel Type is " << imageIO->GetComponentTypeAsString(pixelType) // 'double'
<< std::endl;
const size_t numDimensions = imageIO->GetNumberOfDimensions();
std::cout << "numDimensions: " << numDimensions << std::endl; // '2'
std::cout << "component size: " << imageIO->GetComponentSize() << std::endl; // '8'
std::cout << "pixel type (string): " << imageIO->GetPixelTypeAsString(imageIO->GetPixelType()) << std::endl; // 'vector'
std::cout << "pixel type: " << imageIO->GetPixelType() << std::endl; // '5'
/*
switch (pixelType)
{
case itk::ImageIOBase::COVARIANTVECTOR:
typedef itk::Image<unsigned char, 2> ImageType;
ImageType::Pointer image = ImageType::New();
ReadFile<ImageType>(inputFilename, image);
break;
typedef itk::Image<unsigned char, 2> ImageType;
ImageType::Pointer image = ImageType::New();
ReadFile<ImageType>(inputFilename, image);
break;
default:
std::cerr << "Pixel Type ("
<< imageIO->GetComponentTypeAsString(pixelType)
<< ") not supported. Exiting." << std::endl;
return -1;
}
*/
我还从事SimpleITK项目,该项目为ITK提供了简化的层,旨在为快速原型制作和交互式计算(如脚本语言)设计。 它添加了一个图层,可自动将图像加载到正确的类型。 如果您来自Matlab,则过渡可能会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.