2014-10-27 3 views
0

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

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(); 
} 

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

вход: enter image description here

выход:

enter image description here

ответ

0

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

0

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

memcpy(localBuffer->GetDataPointer(), img.data(), numberOfPixels * sizeof(RGBPixelType)); 
+0

Да я вижу, что, но знаю, у меня есть один и тот же образ, который реплицируется 9 раз. http://img4.hostingpics.net/pics/641095output.png –

1

CImg хранит разные RGB пикселей в виде отдельных COMPONENTES

Вы должны подготовить буфер 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 
Смежные вопросы