ITK Импорт данных изображения из буфера

Я закодировал метод для создания изображения Itk из буфера (в моем случае это тип изображения Cimg). Это алгоритм:

void Cimg_To_ITK (CImg<uchar> img)
{

    const unsigned int Dimension = 2;
    typedef itk::RGBPixel< unsigned char > RGBPixelType;
    typedef itk::Image< RGBPixelType, Dimension > RGBImageType;
    typedef itk::ImportImageFilter< RGBPixelType, Dimension > ImportFilterType;
    ImportFilterType::Pointer importFilter = ImportFilterType::New();
    typedef itk::ImageFileWriter<  RGBImageType  > WriterType;
    WriterType::Pointer writer = WriterType::New();


    RGBImageType::SizeType imsize;
    imsize[0] = img.width();
    imsize[1] = img.height();

    ImportFilterType::IndexType start;
    start.Fill( 0 );
    ImportFilterType::RegionType region;
    region.SetIndex( start );
    region.SetSize( imsize );
    importFilter->SetRegion( region );

    const itk::SpacePrecisionType origin[ Dimension ] = { 0.0, 0.0 };
    importFilter->SetOrigin( origin );

    const itk::SpacePrecisionType spacing[ Dimension ] = { 1.0, 1.0 };
    importFilter->SetSpacing( spacing );

    const unsigned int numberOfPixels = imsize[0] * imsize[1];
    const bool importImageFilterWillOwnTheBuffer = true;

    RGBPixelType * localBuffer = new RGBPixelType[ numberOfPixels ];
    memcpy(localBuffer->GetDataPointer(), img.data(), numberOfPixels);
    importFilter->SetImportPointer( localBuffer, numberOfPixels,importImageFilterWillOwnTheBuffer );
    writer->SetInput( importFilter->GetOutput() );
    writer->SetFileName( "output.png" );
    writer->Update();
}

У меня нет того, что я хочу в качестве вывода:

ввод: введите здесь описание изображения

выход :

введите здесь описание изображения


person Ben Chaaben Assil    schedule 27.10.2014    source источник


Ответы (3)


Также было бы неплохо проверить, как Cimg хранит пиксели для изображения и отличается ли он от RGBPixelType. Я подозреваю, что массив RGBPixelType имеет пиксели, хранящиеся в rgbrgbrgbrgb, в то время как другой может иметь их в каком-то формате стиля rrrrggggbbbb. Или, как уже упоминалось, если вход представляет собой изображение в градациях серого с одним каналом, вы должны реплицировать значение для каждого значения rgb (или, если оба являются rgb, вам нужно скопировать данные из всех трех каналов)...

person Sami Varjo    schedule 27.10.2014

CImg хранит разные пиксели RGB как отдельные компоненты.

Вы должны подготовить буфер RGBPixel, перебрать изображение и сохранить его в буфер:

 RGBPixelType *buffer=new RGBPixelType[img.width()*img.height()];
 cimg_for(img,x,y)
 {
          // Now allign three colors
          buffer[x+y*img.width()]= RGBPixelType({img(x,y,0,0),img(x,y,0,1),img(x,y,0,2)});
 }
 importImageFilterWillOwnTheBuffer=true; // To avoid leaks
person Kiko Albiol Colomer    schedule 04.08.2015

Вероятно, это потому, что вы просто копируете один байт на пиксель. Каждый RGBPixelType, вероятно, имеет размер в несколько байтов:

memcpy(localBuffer->GetDataPointer(), img.data(), numberOfPixels * sizeof(RGBPixelType));
person berne    schedule 27.10.2014
comment
Да, я вижу это, но знаю, что у меня есть то же самое изображение, которое копировалось 9 раз. img4.hostingpics.net/pics/641095output.png - person Ben Chaaben Assil; 27.10.2014