作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
绪论
在本文中,将介绍如何使用ITK(Insight Segmentation and Registration Toolkit)库来读取和写入图像文件。ITK是一款开源软件库,主要用于医学图像分析。接下来将演示如何读取JPEG图像文件,并将其保存为另一个JPEG文件。这是ITK图像处理的基础操作之一。
环境准备
参见:Windows下用CMake编译ITK及配置测试_itk配置-CSDN博客
功能解析
1.引入必要的头文件:
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryThresholdImageFilter.h>
#include <itkImageIOFactory.h>
#include <itkPNGImageIOFactory.h>
#include <itkJPEGImageIOFactory.h>
我们需要引入ITK库的头文件,以便使用它们提供的图像读取、写入和处理功能。
2.初始化图像类型和读写器:
typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
itk::JPEGImageIOFactory::RegisterOneFactory();
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
ImageType
定义了图像的数据类型和维度。这里我们使用unsigned char
类型的2D图像。ReaderType
和WriterType
分别定义了图像读取器和写入器的类型。itk::JPEGImageIOFactory::RegisterOneFactory()
注册了JPEG格式的IO工厂,以便ITK可以处理JPEG格式的图像文件。ReaderType::Pointer reader = ReaderType::New()
和WriterType::Pointer writer = WriterType::New()
分别创建了图像读取器和写入器的实例。
3.设置文件名和输入输出:
reader->SetFileName("test.jpg"); //要读取的文件名
writer->SetFileName("output.jpg"); //写入的文件名
writer->SetInput(reader->GetOutput());
reader->SetFileName("test.jpg")
设置要读取的图像文件的名称。writer->SetFileName("output.jpg")
设置要写入的图像文件的名称。writer->SetInput(reader->GetOutput())
将读取器的输出连接到写入器的输入,这样读取的图像可以直接写入到指定文件中。
4.执行读取和写入操作:
try
{
writer->Update();
}
catch (itk::ExceptionObject &error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
writer->Update()
执行写入操作,将读取的图像保存到指定的文件中。- 使用
try-catch
块捕获可能的异常,并在发生错误时输出错误信息。
完整代码
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkBinaryThresholdImageFilter.h>
#include <itkImageIOFactory.h>
#include <itkPNGImageIOFactory.h>
#include <itkJPEGImageIOFactory.h>
int main()
{
// 初始化
typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
itk::JPEGImageIOFactory::RegisterOneFactory();
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
// 设置
reader->SetFileName("test.jpg"); //要读取的文件名
writer->SetFileName("output.jpg"); //写入的文件名
writer->SetInput(reader->GetOutput());
// 输出
try
{
writer->Update();
}
catch (itk::ExceptionObject &error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
std::cout << "Image segmentation completed successfully." << std::endl;
return EXIT_SUCCESS;
}
测试效果
输入和输出一致。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!