回到首頁

影像對位 (Image Registration): 使用 SIFT 對齊影像堆疊

1. 什麼是影像對位 (Image Registration)?

影像對位(或稱影像對齊、配準)是將兩張或多張影像進行空間上的對齊,使得影像中相同的物體或特徵能夠重疊在一起的過程。這在許多科學分析中是至關重要的一步。

常見應用場景:

本章節將介紹如何使用 Fiji 內建的 Linear Stack Alignment with SIFT 插件,對一個有位移和旋轉的影像堆疊進行自動對位。

2. 準備工作:產生一個測試用的影像stack

為了演示對位的功能,我們首先用一個簡單的 Macro 腳本來產生一個「故意沒對齊」的影像stack。這個腳本會使用Blobs這個範例影像檔,利用迴圈不斷地對其進行微小的位移和旋轉,產生一系列連續但抖動的影像。

Macro 腳本

將以下程式碼複製到 Fiji 的腳本編輯器 (File > New > Script...),語言選擇 ImageJ Macro,然後點擊 Run

// 參數設定
n = 10; // 產生幾張圖片
width = 256;
height = 254;

newImage("Stack", "8-bit black", width, height, 1); // 初始化 Stack
selectWindow("Stack");


// 主迴圈
for (i = 0; i < n; i++) {
    run("Blobs (25K)");
    wait(100);
    originalTitle = getTitle();
    /*
    scaleX = 1 + random()*0.4;
    scaleY = 1 + random()*0.4;
    */
    scaleX = 1 + random()*0.5;
    scaleY = scaleX;
    angle = random()*20 - 10;
    dx = random()*30-15;
    dy = random()*30-15;
    // 計算縮放比例

    run("Scale...", "x=" + scaleX + " y=" + scaleY + " interpolation=Bilinear average process create");
    wait(100);
    scaledTitle = getTitle();
    close(originalTitle);

    // 旋轉

    run("Rotate... ", "angle=" + angle + " grid=1 interpolation=Bilinear enlarge");


    // 平移
    makeRectangle(0, 0, getWidth(), getHeight());
    run("Translate...", "x=" + dx + " y=" + dy);

    // 裁切
    makeRectangle(0, 0, width, height);
    run("Crop");

    // 複製貼入 Stack
    run("Copy");
    selectWindow("Stack");
    run("Add Slice");
    run("Paste");

    // 關閉處理圖
    close(scaledTitle);
}
selectWindow("Stack");
setSlice(1);
run("Delete Slice");

執行完畢後,你會得到一個名為 Misaligned_Stack 的影像堆疊。用滑鼠滾輪或下方的滑桿來回瀏覽,你會清楚地看到影像有明顯變換。這就是我們要校正的目標。

3. 使用 Linear Stack Alignment with SIFT 進行對位

SIFT (Scale-Invariant Feature Transform) 是一種強大的電腦視覺演算法,它能在影像中找到獨特的「特徵點」,即使影像經過縮放、旋轉或亮度變化,這些特徵點也能被穩定地識別和匹配。Fiji 的對位插件就是利用這個原理來計算出每張影像之間的轉換關係。

SIFT 設定視窗參數說明

當您執行 Plugins > Registration > Linear Stack Alignment with SIFT 時,會彈出一個設定對話框。以下是其中各項主要參數的詳細說明:

1. Scale Invariant Interest Point Detector(尺度不變特徵點偵測器)

SIFT 的第一步是檢測影像中的關鍵特徵點。這些點在不同尺度下都能被穩定地檢測到,因此稱為「尺度不變」。

2. Feature Descriptor(特徵描述符)

找到特徵點後,SIFT 會為每個點計算一個「描述符」,這個描述符包含了該點周圍區域的梯度資訊,並對旋轉具有不變性。

3. Geometric Consensus Filter(幾何一致性篩選器)

在找到一組初始的特徵點匹配後,通常還需要一個「幾何一致性篩選器」來排除錯誤的匹配,找到一組符合某種幾何變換關係的匹配點對。

4. Output(輸出選項)

操作步驟

  1. 確保 Stack 是當前作用中的影像視窗。
  2. 執行 Plugins > Registration > Linear Stack Alignment with SIFT
  3. 會彈出設定對話框,您可以根據上述說明調整參數。
  4. 點擊 OK 開始執行。插件會計算每張影像與前一張影像的對應關係,並產生一個新的、已對齊的影像堆疊。

4. 評估對位結果

對位完成後,你會得到一個新的視窗,標題通常是 Aligned Stack

  1. 直接觀察: 在新的對齊後影像堆疊上,使用滑鼠滾輪或下方的滑桿來回瀏覽。你會發現,原本的抖動和旋轉幾乎完全消失了。
  2. 動畫比較:
    • 將原始的stack對齊後的stack視窗並排。
    • 分別在兩個視窗上執行 Image > Stacks > Start Animation (或按 \ 鍵)。
    • 你會非常直觀地看到對位前後的差異。

如何觀察影像是否需要對位?

在進行影像對位前,首要的問題是:「如何判斷我的影像堆疊有位移,以及對位後效果好不好?」除了手動瀏覽影像外,我們可以用 Z-投影 (Z-projection) 的方法來客觀、快速地視覺化影像的抖動程度。

1. 產生一個僅有平移位移的測試影像堆疊

為了演示這個方法,我們先修改先前的 Macro 腳本,讓它只產生平移位移,移除旋轉和縮放,以模擬常見的顯微鏡平台漂移。

修改後的 Macro 腳本

// Macro to create a stack with only translational jitter

// Parameters
n = 20; // Number of slices to generate
width = 256;
height = 254;
max_shift = 5; // Maximum pixel shift in x and y

// Initialize the stack
newImage("Shifted Stack", "8-bit black", width, height, 1);
selectWindow("Shifted Stack");

// Main loop to create shifted slices
for (i = 0; i < n; i++) {
    // Open the base image
    run("Blobs (25K)");
    originalTitle = getTitle();

    // Generate random translation values
    dx = random() * max_shift * 2 - max_shift; // Shift between -5 and +5
    dy = random() * max_shift * 2 - max_shift; // Shift between -5 and +5

    // Apply translation
    run("Translate...", "x=" + dx + " y=" + dy + " interpolation=None");

    // Copy the shifted image to the stack
    run("Copy");
    selectWindow("Shifted Stack");
    run("Add Slice");
    run("Paste");

    // Clean up
    close(originalTitle);
}

// Clean up the initial slice
selectWindow("Shifted Stack");
setSlice(1);
run("Delete Slice");
print("Shifted Stack created with " + nSlices() + " slices.");

這段腳本會產生一個名為 Shifted Stack 的影像堆疊,其中每一張影像都相對於前一張有微小的隨機平移。

2. 使用標準差 Z-投影 (Standard Deviation Z-Project) 視覺化位移

這個方法是評估對位的核心技巧。

3. 使用 LUT 增強視覺化效果

為了讓標準差的差異更明顯,我們可以為這張投影圖套上偽彩色查找表 (LUT)。

  1. 選取標準差投影圖。
  2. 執行 Image > Lookup Tables,並選擇一個對比強烈的 LUT,例如 FireRainbow RGB16 Colors

套用後,位移最大的區域會被標示為最醒目的顏色(例如紅色或白色),讓你對位移的嚴重程度一目了然。

4. 評估對位後的效果

這個方法同樣可以用來驗證對位是否成功。

  1. 對原始的 Shifted Stack 執行 SIFT 對位,得到 Aligned Stack
  2. 對這個 Aligned Stack 重複進行一次標準差 Z-投影

比較前後兩張標準差投影圖,你會發現:

實作

  1. 影片是顯微鏡下拍攝的紫錦草雄蕊毛的細胞,請用ffmpeg匯入,只需要匯入240-270的frames,然後進行對位。
  2. 對位後,使用標準差的z投影,並進行套色。

教學影片


selectImage("before");
run("Z Project...", "projection=[Standard Deviation]");
selectImage("after");
run("Z Project...", "projection=[Standard Deviation]");

selectImage("after");
run("Z Project...", "projection=[Average Intensity]");
run("8-bit");

selectImage("STD_after");
run("8-bit");

run("Fire");

run("Enhance Contrast", "saturated=0.35");
run("Apply LUT");

selectImage("AVG_after");
run("Merge Channels...", "c1=STD_after c4=AVG_after create");