itk读取图片
typedef itk::Image<UCHAR, Dimension> ImageType_8bits;
typedef itk::Image<USHORT, Dimension> ImageType_16bits;//第一个图图片类型16位,第二个是位数3维图片或者二维图片
typedef itk::ImageFileReader<ImageReader::ImageType_8bits> ReaderType_8bits;
typedef itk::ImageFileReader<ImageReader::ImageType_16bits> ReaderType_16bits;
typedef itk::TIFFImageIO TIFFIOType;
//获取图片信息
bool ImageReader::GetImageInfo(const std::string& path)
{
if (!paramPack) return false;
TIFFIOType::Pointer tiffIO = TIFFIOType::New();
if (!tiffIO->CanReadFile(path.c_str())){
return false;
}
tiffIO->SetFileName(path.c_str());
tiffIO->ReadImageInformation();
int x, y, z;
itk::ImageIOBase::IOComponentType bitspersample = tiffIO->GetComponentType();
if (Dimension!=tiffIO->GetNumberOfDimensions()){
return false;
}
x = tiffIO->GetDimensions(0);
y = tiffIO->GetDimensions(1);
z = tiffIO->GetDimensions(2);
paramPack->xRangeMax_ = x;
paramPack->yRangeMax_ = y;
paramPack->zRangeMax_ = z;
dataType = bitspersample == itk::ImageIOBase::IOComponentType::UCHAR ? DATATYPE::IMAGE8 : DATATYPE::IMAGE16;
return true;
}
//读取图片
bool ImageReader::ReadImage_8bits(ImageType_8bits::Pointer &Image, const char *path){
ReaderType_8bits::Pointer Reader = ReaderType_8bits::New();
Reader->SetFileName(path);
try
{
Reader->Update();
}
catch (itk::ExceptionObject&)
{
MITK_ERROR << "Read " << path << "error!";
return 1;
}
Image->Initialize();
Image = Reader->GetOutput();
Image->Update();
return true;
}
//写图片
bool ImageWriter::WriterImage_8bits(ImageType_8bits::Pointer &Image, const char *path){
TIFFIOType::Pointer tiffIO = TIFFIOType::New();
/*tiffIO->SetCompressionToLZW();*/
WriterType_8bits::Pointer Writer = WriterType_8bits::New();
Writer->SetFileName(path);
Writer->SetInput(Image);
Writer->SetImageIO(tiffIO);
Writer->UseCompressionOn();
try
{
Writer->Update();
}
catch (itk::ExceptionObject &)
{
MITK_INFO << path << "\t write error!";
return false;
}
return true;
}
除了TIF格式的,还支持其他格式的
typedef itk::ImageFileWriter<ImageType_16bits> WriterType_16bits;
typedef itk::PNGImageIO PNGIOType;
bool Crowdsourcing::WriteImage16Bit(uint16 *Image, const char* path, int width, int height)
{
itk::PNGImageIO::Pointer PNGIO = itk::PNGImageIO::New();
bool isFileValid = PNGIO->CanWriteFile(path);
if (!isFileValid){
return false;
}
else
{
ImageType_16bits::Pointer InputImage = ImageType_16bits::New();
WriterType_16bits::Pointer Writer = WriterType_16bits::New();
ImageType_16bits::IndexType start;
start.Fill(0);
ImageType_16bits::SizeType size;
size[0] = width;
size[1] = height;
ImageType_16bits::RegionType region(start, size);
InputImage->SetRegions(region);
InputImage->Allocate();
InputImage->FillBuffer(0);
memcpy(InputImage->GetBufferPointer(), Image, sizeof(uint16)* width * height);
itk::PNGImageIO::Pointer pngio = itk::PNGImageIO::New();
Writer->SetFileName(path);
Writer->SetInput(InputImage);
Writer->SetImageIO(pngio);
Writer->UseCompressionOn();
try
{
Writer->Update();
}
catch (itk::ExceptionObject &)
{
std::cout << path << "\t write error!";
return false;
}
return true;
}
}