Python

Python ITK 以 Observer 監看影像對準過程教學與範例

介紹如何使用 ITK 的 observer 監看影像對準過程,繪製及時的距離變化圖,確認收斂情況。

影像對準(image registration)的計算過程需要確認結果是否正確收斂到最佳解,在 ITK 中我們可以透過設定 observer 的方式,取出每次疊代產生的 metric 數值,並及時繪製出圖形,方便開發者調整參數。

以下幾個回呼函數(callback function)可用來繪製即時的 metric 數值收斂狀況。

from IPython.display import clear_output

# 初始事件回呼函數
def cb_registration_start():
    global cb_metric_values
    global cb_current_iteration_number
    cb_metric_values = []
    cb_current_iteration_number = -1

# 結束事件回呼函數
def cb_registration_end():
    global cb_metric_values
    global cb_current_iteration_number
    del cb_metric_values
    del cb_current_iteration_number
    plt.close()

# 疊代事件回呼函數
def cb_registration_iteration():
    global cb_metric_values
    global cb_current_iteration_number

    # 忽略重覆產生的疊代事件
    if optimizer.GetCurrentIteration() == cb_current_iteration_number:
        return

    cb_current_iteration_number = optimizer.GetCurrentIteration()
    cb_metric_values.append(optimizer.GetValue())

    # 清空輸出
    clear_output(wait=True)

    # 繪製 Metric 圖形
    plt.plot(cb_metric_values)
    plt.xlabel('Iteration Number', fontsize=12)
    plt.ylabel('Metric Value', fontsize=12)
    plt.show()

定義好這些回呼函數之後,接著在 optimizer 上面加上 sbserver,設定事件與回呼函數的對應關係:

# 加上 Observer,設定事件與回呼函數的對應關係
optimizer.AddObserver(itk.StartEvent(), cb_registration_start)
optimizer.AddObserver(itk.EndEvent(), cb_registration_end)
optimizer.AddObserver(itk.IterationEvent(), cb_registration_iteration)

這樣在執行影像對準的時候,就會及時繪製出 metric 數值收斂的狀況了。

這裡我們將這些 observer 套用在影像平移線性對準的範例中,可得到向這樣的 metric 收斂圖形。

metric 數值收斂狀況

參考資料:ITK discussion forumSimpleITK NotebooksImageRegistration3.py

Share
Published by
Office Guide
Tags: ITK

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago