二、ITK例子-jpg图像读写

只谈情不闲聊 提交于 2019-12-06 05:57:04

一、ITK的读写工作原理

  在ITK里面,我们需要设置读取图像的像素类型,图像类型。

  然后设置读取指针,将读取参数传入。

  同时设置写指针,也将写入文件参数传入。

  为了实现读写动作,我们需要构造一个IO工厂(IOFactory),用来实现读写的动作。

  同时需要一个动作,用来触发上面设置的内容,使得一切开始工作。

 

  这就好比是一台机器,我们并不知道机器内部是如何运行的(factory的工作机制),但是我们可以设置自己知道的参数,然后点击开始开关,

这个时候机器就能够正常运行,达到我们想要的效果。(这个其实也是API的含义所在)。

 

二、下面是对于读写机制的讲解

  

 

 

   首先我们在右侧设置了ImageFileWriter 和ImageFileReader,  告诉函数我们需要操作的目标文件名。

  然后factory创建ImageIO.

  通过ImageIOFactory判断里面的哪一个工人可以对于这个文件进行读写操作。

  比如说这个时候我们查找到了PNGImageIOFactory(确定的工人)可以对于目标文件进行读写操作,一个PNGImageIOFactory 就在内存中创建,作为ImageIOFactory的操作者,就把数据交给它来进行操作的,完成相应的读写操作。

  工作就完成了。

  这个机制就相当于供需平台一样:

  一个人(wirter 或者 reader指针)把自己的需求,比如说修电器发布出来,然后有能力修电器的人接单(可以完成write或者read),然后登记(register),以公司名义(ImageIOFactory)完成相应的操作,结束工作。

  一些ImageIO工厂如下:

  

 

 

 三、例子

  具体的工程构建方法参见博客一

  代码如下:

#include "itkRGBPixel.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkJPEGImageIOFactory.h"
int main(void)
{
    //这里读取的时候是以RGBPixel的形式读取的,如果修改为如下,则是以灰度图读取的  //using PixelType =itk::RGBPixel<unsigned char>;
    using PixelType=unsigned char;
    using ImageType=itk::Image<PixelType, 2>;

    using ReaderType =itk::ImageFileReader<ImageType>;
    using WriterType=itk::ImageFileWriter<ImageType>;
    ReaderType::Pointer reader = ReaderType::New();
    WriterType::Pointer writer = WriterType::New();
    //如果写入的话需要有这一句定义
    itk::JPEGImageIOFactory::RegisterOneFactory();

    reader->SetFileName("1.jpg");
    writer->SetFileName("2.jpg");
    writer->SetInput(reader->GetOutput());
    try
    {
        writer->Update();
    }
    catch (itk::ExceptionObject& err)
    {
        std::cerr << "ExceptionObject caught !" << std::endl;
        std::cerr << err << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

四、注意

  4.1相应的函数的使用要添加头文件    

  4.2更新动作触发的时候,最好是采用如下的代码:

 try
    {
        writer->Update();
    }
    catch (itk::ExceptionObject& err)
    {
        std::cerr << "ExceptionObject caught !" << std::endl;
        std::cerr << err << std::endl;
        return EXIT_FAILURE;
    }

  3、读取文件位于工程目录,在运行程序以后,得到了两个.jpg文件

五、参考文档

  InsightSoftwareGuide-Book2-5.0.1.pdf

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!