簡體   English   中英

使用ITK訪問tif圖像的像素值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM