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