二、ITK例子-jpg圖像讀寫


一、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM