回到首頁

形態學重建

形態學重建是基於形態學操作(膨脹、腐蝕),但能更精確地保留物件的原始形狀。其核心思想是使用一張「標記影像 (Marker Image)」在另一張「遮罩影像 (Mask Image)」的約束下,進行迭代式的膨脹或腐蝕,直到影像不再變化為止。

基本原理

可以將灰階影像想像成一個三維的地形圖,像素的灰階值代表該點的高度。

形態學重建有兩種基本操作:

  1. 膨脹式重建 (Reconstruction by Dilation):

    • 過程: 從「標記影像」開始,反覆進行膨脹操作。
    • 約束: 每一次膨脹的結果,其像素值都不能超過「遮罩影像」對應位置的像素值。
    • 比喻: 想像從標記影像的「山峰」開始注水,水會向周圍流動(膨脹),但水面高度永遠不能超過遮罩影像(原始地形)的高度。最終,所有能從標記點到達的區域都會被「淹沒」到與原始地形相同的高度。
  2. 腐蝕式重建 (Reconstruction by Erosion):

    • 過程: 從「標記影像」開始,反覆進行腐蝕操作。
    • 約束: 每一次腐蝕的結果,其像素值都不能低於「遮罩影像」對應位置的像素值。
    • 比喻: 想像將遮罩影像(原始地形)倒過來,然後從標記影像的位置開始向上「填充」,但填充物不能超出原始地形的邊界。

應用:優於傳統開/閉運算的濾波

形態學重建最常見的應用是「重建式開運算」和「重建式閉運算」,用途是影像去噪,將亮點和暗點移除。

1. 重建式開運算 (Opening by Reconstruction) - 去除亮點

此操作能移除影像中的小型亮點(地形圖中的「小山峰」),同時完美保留較大物件的形狀和尺寸。

2. 重建式閉運算 (Closing by Reconstruction) - 填補暗點

此操作能填補影像中的小型暗點或孔洞(地形圖中的「小坑洞」),同時保留物件的形狀。


與中值濾波器 (Median Filter) 的比較

雖然形態學重建和中值濾波器(Median Filter)都可以用於影像去噪,但原理和適用情境有顯著差異:

特性 (Feature) 形態學重建 (Morphological Reconstruction) 中值濾波器 (Median Filter)
基本原理 使用標記影像在遮罩影像的約束下進行迭代式膨脹/腐蝕。 將每個像素替換為其鄰域內像素灰階值的中位數。
形狀保留 極佳。能完美保留大於結構元素的物件輪廓與尺寸,不會造成收縮或變形。 良好,但較大半徑的濾波可能導致物件的尖角被鈍化、邊緣輕微變形。
去噪機制 移除尺寸小於結構元素的亮點(重建式開)或暗點(重建式閉)。 有效移除椒鹽式雜訊(Salt-and-pepper noise)等孤立的極端值像素。
適用情境 需要在不影響主要物件形狀的前提下,精確移除特定尺寸的雜訊或小物件。 快速去除隨機的亮暗點雜訊,且對邊緣的模糊效應比均值濾波小。
缺點 計算量較大,過程較複雜。 對於大片叢集的雜訊效果有限,且可能模糊細微的紋理。

實作

以下 Macro 腳本將演示如何使用形態學重建來移除 Dot Blot 範例影像中的亮點與暗點,並與中值濾波器 (Median Filter) 的結果進行比較。

run("Dot Blot");
run("Invert");
run("Duplicate...", "title=origin");

/* 
 * 去除亮點
 * 對原始灰階影像進行一次腐蝕(Erosion)。腐蝕會將所有小的山峰消除或變淺,形成一個平滑的底圖。這個平滑後的影像就是你的標記影像。
 */
selectImage("origin");
run("Morphological Filters", "operation=Erosion element=Square radius=2");
rename("erosion-marker");


/*
 * 執行膨脹式重建 (reconstructByDilation),將腐蝕後的標記影像在原始影像的約束下進行膨脹。這個過程會把標記影像「膨脹」回原始影像的形狀,但那些在腐蝕階段被移除的亮點將無法恢復。
 */
run("Morphological Reconstruction", "marker=erosion-marker mask=origin type=[By Dilation] connectivity=8");
rename("deLightResult");


/*
 * 移除暗點(Pepper Noise)
 * 暗點在灰階影像的地形圖中代表微小的「山谷」。膨脹式重建的「注水」原理正好可以用來填平這些小山谷。
 * 對原始灰階影像進行一次膨脹(Dilation)。膨脹會有效地小的「山峰」(包括亮點)擴大或與其他山峰合併,暗點填平,形成一個平滑的頂圖。這個平滑後的影像就是你的標記影像。
 */
selectImage("origin");
run("Morphological Filters", "operation=Dilation element=Square radius=2");
rename("dilation-marker");

/*
 * 執行腐蝕式重建 (reconstructByErosion),將膨脹後的標記影像在原始影像的約束下進行腐蝕。這個過程會把標記影像「腐蝕」回原始影像的形狀,但那些在膨脹階段被移除的亮點將無法恢復。
 */

run("Morphological Reconstruction", "marker=dilation-marker mask=origin type=[By Erosion] connectivity=8");
rename("deDarkResult");



/*
 * 結合以上兩者操作,進行連續操作
 * 
*/


selectImage("origin");
run("Morphological Filters", "operation=Erosion element=Square radius=2");
rename("erosion-marker");


run("Morphological Reconstruction", "marker=erosion-marker mask=origin type=[By Dilation] connectivity=8");
rename("deLightResult");


selectImage("deLightResult");
run("Morphological Filters", "operation=Dilation element=Square radius=2");
rename("dilation-marker");

run("Morphological Reconstruction", "marker=dilation-marker mask=deLightResult type=[By Erosion] connectivity=8");
rename("result");

// 新增中值濾波器做比較
selectImage("origin");
run("Duplicate...", "title=median-result");
run("Median...", "radius=2");


// 觀察原始影像和兩種處理後影像的差異
imageCalculator("Subtract create 32-bit", "origin","result");
selectImage("Result of origin");
rename("Diff-Reconstruction");
setMinAndMax(-100, 100);
run("3-3-2 RGB");

imageCalculator("Subtract create 32-bit", "origin","median-result");
selectImage("Result of origin");
rename("Diff-Median");
setMinAndMax(-100, 100);
run("3-3-2 RGB");

run("Tile");