一、說明
醫療圖像配准是ITK的一個重要內容,而我們今天想要說的一個程序則相當於是其中的HelloWorld程序。
程序源碼位置:
InsightToolkit-5.0.1\Examples\RegistrationITKv4\\ImageRegistration1.cxx
二、ITK的配准框架
三、程序的主要思路
程序的主要思路可以用如下的框圖來表示:
其中我們需要輸入輸出的文件如下:
但是在這里,為了便於程序閱讀,這個時候我把所有的參數全部都寫在了程序里面。
四、工程構建
1-構建工程
按照之前的方法,利用已經有的源文件構建一個工程,並且添加屬性表和動態鏈接庫文件。
2-程序修改
源碼程序這個時候不是能用的,需要稍作修改
2.1將每一個argv參數的位置直接修改為文件名
參數含義如下:
參數 | 內容 |
argv[1] | 參考圖片 |
argv[2] | 待配准圖片 |
argv[3] | 輸出待配准圖片(以參考圖片格式輸出) |
argv[4] | 兩個輸入圖片配准之后的差值圖片 |
argv[5] | 兩個輸入圖片未配准的時候的差值圖片 |
實際程序里面修改:
//參考圖片位置
fixedImageReader->SetFileName("D:\\FilesSetup\\ITK\\InsightToolkit-5.0.1\\Examples\\Data\\BrainProtonDensitySliceBorder20.png"); //待配准圖片位置
movingImageReader->SetFileName("D:\\FilesSetup\\ITK\\InsightToolkit-5.0.1\\Examples\\Data\\BrainProtonDensitySliceShifted13x17y.png");
//文件寫入位置,這三張圖片全部都寫入到本工程目錄下
writer->SetFileName("D:\\Files\\ITKFiles\\ITK_6_Registration\\Data\OutputData\\Moving13x17yInputType.png");
writer2->SetFileName("D:\Files\ITKFiles\ITK_6_Registration\Data\OutputData\Moving13x17yInputType.png");
writer2->SetFileName("D:\\Files\\ITKFiles\\ITK_6_Registration\\Data\\OutputData\\DifferenceBeforeRegistration.png");
2.2添加頭文件
因為要閱讀png文件,所以需要添加png文件的IOFactory
#include "itkPNGImageIOFactory.h"
初始化IOFactory:
itk::PNGImageIOFactory::RegisterOneFactory();
2.3添加命令行參數
因為程序里面有對輸入參數的判斷,當我們修改以后,還是要滿足輸入參數的個數(雖然我們已經不用這個參數了,但是這個判斷條件是程序運行的觸發條件)
打開調試-屬性:
在調試-命令參數里面輸入六個隨意數字,以空格間隔:
五、運行結果
得到的幾張圖片與參考書吻合:
控制台輸出如下:
可以看到,一共經過了36次迭代,最后計算出來的測度函數值為0.0007,然后得到的偏移量是(13,17),和圖片的真實偏移量是符合的
六、參考
InsightSoftwareGuide-Book2-5.0.1 Page189(書籍頁碼)
七、問題
今天出了一個糗事,我在構建工程的時候,由於偷懶,直接復制的另外一個工程,然后程序都已經修改好了,不論怎么運行,都沒有輸出。
還以為是函數復制出了問題,但是這個時候我才發現,我根本沒有把這個main.cpp文件添加到工程里面。
害的我特地對比了一下是不是函數復制的時候出了問題。
......
不注重細節害死人啊。