我的印象中,你是c-用ITK管道從一個長的「唯一主」功能開始,現在你想通過在一些函數中分解代碼來使代碼更具可讀性,並且你對C++不是很有信心。如果不是這樣,可能我的答案會重複你已經知道的東西。
首先,ITK有這個漂亮的流水線結構,這樣你就可以準備一個接一個連接過濾器的流水線,然後調用update過濾並獲取整個管道來處理圖像。如果將輸入更改爲第一個過濾器,並再次調用最後一個過濾器的更新,則會再次開始處理,因爲過濾器檢測到其輸入已從上次更改過。初學者的一個典型錯誤(至少對我來說)是嘗試在分配輸入之後立即獲得過濾器的輸出,而不確保從該過濾器或之後的過濾器更新。無論如何,你也可以在每個過濾器之後調用update,只是爲了確保一切順利(並且爲了更容易的調試)。我不確定是否存在性能問題,但在我的應用程序中我沒有注意到。
因此,當您從這些功能獲得輸出時,請記住這一點!其次,ITK智能指針可以簡化您的編程,因爲您不必在使用後記得刪除它們,而且您不必擔心從函數返回時它們會超出範圍。這也意味着有時候事情並沒有像預期的那樣得到更新,因爲它們仍然保留着舊數據(例如,如果在for循環中重置你的過濾器,如果它在外部聲明的話,你必須小心)。但通常他們會簡化你的生活。
在每個函數內部製作小型流水線並不困難:您的輸出將只是指向函數中最後一個篩選器的輸出的指針。您可以將此指針設置爲函數的返回值(另請參閱http://www.itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction)。或者你可以通過引用傳遞輸出圖像(如在你的僞代碼中,如果你傳遞了你已經通過引用傳遞的指針)。有關C++的更新,請參閱例如http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/。僞代碼:
int main()
{
ImageType::Pointer inputimage, output1, output2;
inputimage = reader -> GetOutput();
output1 = function1 (inputimage) // where input is Image
function2 (output1, output2) // where input now is the output of function1 , pass argument by reference
}
ImageType::Pointer function1 (ImageType::Pointer aInput)
{
somefilter::pointer filter = somefilter::new()
filter ->SetInput(aInput);
filter->Update(); // unless you know what you are doing (you know that youe will access the data only at the end)
return filter->GetOutput()
}
void function2 (ImageType::Pointer aInput, ImageType::Pointer aOutput)
{
somefilter::pointer filter = somefilter::new()
filter ->SetInput(aInput);
filter->Update();
aOutput = filter->GetOutput()
}
你甚至可以決定複製圖像(所以它的獨立從產生它的管道),並將其發送給另一個管道,看到http://www.itk.org/Wiki/ITK/Examples/SimpleOperations/ImageDuplicator
作爲一個側面說明,你也可以用itk過濾器作爲成員創建你自己的類,在初始化時創建管道,然後在你的方法中修改過濾器的輸入,而不是每次重新創建管道。
來源
2014-07-25 17:00:19
lib
我不清楚如果你想擁有一個連接的管道,並讓這些函數在管道中創建連接的ProcessObject。這將完成啓用流或其他管道特定功能。或者如果你正在接近某個過濾器的過程接口。你鏈接的例子將是一個程序方法。如果您對ITK的程序方法感興趣,那麼SimpleITK可以提供您所需要的。 – blowekamp