from skimage.transform import resize 的 mode 有哪一些選項? 差異是什麼? 哪一個最能還原原始資料狀況?

 

 


 

 

skimage.transform.resizemode 參數決定了當輸入影像超出邊界時如何處理填充值。主要選項如下:

mode 參數的選項:

  1. constant(預設值)
    • 超出範圍的部分填充為 cval(預設 0)。
    • 可能會在邊界處產生明顯的黑邊(如果 cval=0)。
  2. edge
    • 使用最接近邊界的像素值進行填充,適合保持邊界的連續性。
  3. reflect
    • 以邊界為鏡像對稱翻轉填充。例如:... | c b a | a b c | ...
    • 適合避免邊界的突兀變化,適合處理平滑影像。
  4. symmetric
    • reflect 類似,但鏡像對稱發生在邊界上。例如:... | c b a | b a b | ...
    • 類似於 reflect,但邊界行為稍有不同。
  5. wrap
    • 超出範圍的部分會從影像的另一側循環對應。例如:... | a b c | a b c | ...
    • 適合週期性影像(如紋理處理),但一般影像可能會產生不自然的邊界。

哪個最能還原原始資料狀況?

  • 若希望邊界保持平滑reflectsymmetric(這兩者適合自然影像,因為能減少邊界不連續的情況)。
  • 若影像具有週期性wrap
  • 若不希望引入額外的資訊constant(但要小心邊界變黑或影響影像統計特性)。
  • 若希望邊界盡可能保持原值edge(但可能會產生較硬的邊界)。

推薦選擇
若目的是在 resize 過程中盡量保留原始影像的特性,通常 reflect 會是較好的選擇,因為它能減少邊界影響,並保留影像的平滑度。

 

 

 


有使用範例嗎?

 


當然,這裡有一個簡單的範例,示範 skimage.transform.resize 的不同 mode 參數對影像邊界的影響。

範例程式碼:

import numpy as np
import matplotlib.pyplot as plt
from skimage.transform import resize
from skimage import data

# 讀取範例影像(使用 skimage 內建的 camera 影像)
image = data.camera()

# 設定新的尺寸
output_shape = (300, 300)

# 定義不同的 mode
modes = ["constant", "edge", "reflect", "symmetric", "wrap"]

# 繪製比較圖
fig, axes = plt.subplots(1, len(modes) + 1, figsize=(15, 5))

# 原始影像
axes[0].imshow(image, cmap="gray")
axes[0].set_title("Original")
axes[0].axis("off")

# 依照不同 mode 進行 resize
for i, mode in enumerate(modes):
    resized_image = resize(image, output_shape, mode=mode)
    axes[i + 1].imshow(resized_image, cmap="gray")
    axes[i + 1].set_title(mode)
    axes[i + 1].axis("off")

plt.tight_layout()
plt.show()

不同 mode 的效果說明

  1. constant(預設模式)

    • 邊界區域填充為 0(黑色),導致邊界變暗。
  2. edge

    • 邊界區域使用最接近的像素值填充,邊界的變化較硬。
  3. reflect

    • 影像邊界會鏡像反射,保持較自然的邊界過渡。
  4. symmetric

    • reflect 類似,但反射發生在邊界本身,使邊界稍微平滑。
  5. wrap

    • 影像邊界循環到另一側,適合週期性影像(但對一般影像可能產生奇怪的邊界)。

這段程式碼能夠直觀地看到不同 mode 的影響,並幫助你選擇最適合的方式來保留影像特徵