[英]Convert Cimg to ITK
I'm trying to convert a Cimg image to itk image to use it for registration algorithm. 我正在尝试将Cimg图像转换为itk图像以将其用于注册算法。 The Cimg is a RGB image and i want to convert it to RGB itk image.
Cimg是RGB图像,我想将其转换为RGB itk图像。 Her is my code :
她是我的密码:
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 ];
RGBPixelType * it = localBuffer;
memcpy(*it, img.data(), numberOfPixels);
importFilter->SetImportPointer( localBuffer, numberOfPixels,importImageFilterWillOwnTheBuffer );
writer->SetFileName( "output.png" );
}
I get this error at compilation : 我在编译时收到此错误:
error: cannot convert 'RGBPixelType {aka itk::RGBPixel}' to 'void*' for argument '1' to 'void* memcpy(void*, const void*, size_t) 错误:无法将参数'1'的'RGBPixelType {aka itk :: RGBPixel}'转换为'void *'到'void * memcpy(void *,const void *,size_t)
What is wrong?? 怎么了??
*it
is a RGBPixelType
, it can't be converted to a void pointer and memcpy()
can't handle it. *it
是RGBPixelType
,不能将其转换为void指针,而memcpy()
无法处理它。 memcpy()
needs pointers to values, such as img.data()
or it
. memcpy()
需要指向值的指针,例如img.data()
或it
。 According to the documentation of CImg : 根据CImg的文档:
T* data ()
Return a pointer to the first pixel value.T* data ()
返回指向第一个像素值的指针。
An example of how to import an image from a buffer of values is provided by ITK here . ITK 在此提供了一个如何从值缓冲区中导入图像的示例。 My guess is that it is your starting point.
我的猜测是这是您的起点。
The other issue that you will soon face is the size of the image : RBG is 3 bytes per pixel, so it should be 您即将面临的另一个问题是图像的大小:RBG是每个像素3个字节,因此应该是
memcpy(it, img.data(), numberOfPixels*3);
Here is an example of how to import a buffer of unsigned char as an ITK RGB Image, starting from your code. 这是一个示例,该示例从代码开始,介绍如何将未签名的char缓冲区作为ITK RGB图像导入。 Feel free to edit this answer and add the function to handle a CImg !
随时编辑此答案并添加处理CImg的功能!
#include <iostream>
#include <itkImage.h>
using namespace itk;
using namespace std;
#include <itkImportImageFilter.h>
#include <itkImageFileWriter.h>
void Cimg_To_ITK (unsigned char* data)
{
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();
imsize[0] = 100;
imsize[1] = 200;
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 ];
RGBPixelType * it = localBuffer;
memcpy(it, data, numberOfPixels*3);
// no need to delete localBuffer : itk will care since importImageFilterWillOwnTheBuffer=true
importFilter->SetImportPointer( localBuffer, numberOfPixels,importImageFilterWillOwnTheBuffer );
writer->SetFileName( "output.png" );
writer->SetInput(importFilter->GetOutput() );
writer->Update();
}
int main()
{
unsigned char* data=new unsigned char[100*200*3];
for(int i=0;i<200;i++){
for(int j=0;j<100;j++){
data[(i*100+j)*3]=i;
data[(i*100+j)*3+1]=0;
data[(i*100+j)*3+2]=j;
}
}
Cimg_To_ITK (data);
delete[] data;
cout<<"running fine"<<endl;
return 0;
}
The file CMakeLists.txt
: 文件
CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(ItkTest)
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
add_executable(MyTest main.cpp)
target_link_libraries(MyTest ${ITK_LIBRARIES})
After installing ITK and setting the environment variable ITK_DIR
, type cmake .
安装ITK并设置环境变量
ITK_DIR
,键入cmake .
and make
to build this example. 并
make
建立这个例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.