from skimage.transform import resize 的 mode 有哪一些選項? 差異是什麼? 哪一個最能還原原始資料狀況?
skimage.transform.resize 的 mode 參數決定了當輸入影像超出邊界時如何處理填充值。主要選項如下:
mode 參數的選項:
constant(預設值)- 超出範圍的部分填充為
cval(預設0)。 - 可能會在邊界處產生明顯的黑邊(如果
cval=0)。
- 超出範圍的部分填充為
edge- 使用最接近邊界的像素值進行填充,適合保持邊界的連續性。
reflect- 以邊界為鏡像對稱翻轉填充。例如:
... | c b a | a b c | ...。 - 適合避免邊界的突兀變化,適合處理平滑影像。
- 以邊界為鏡像對稱翻轉填充。例如:
symmetric- 與
reflect類似,但鏡像對稱發生在邊界上。例如:... | c b a | b a b | ...。 - 類似於
reflect,但邊界行為稍有不同。
- 與
wrap- 超出範圍的部分會從影像的另一側循環對應。例如:
... | a b c | a b c | ...。 - 適合週期性影像(如紋理處理),但一般影像可能會產生不自然的邊界。
- 超出範圍的部分會從影像的另一側循環對應。例如:
哪個最能還原原始資料狀況?
- 若希望邊界保持平滑:
reflect或symmetric(這兩者適合自然影像,因為能減少邊界不連續的情況)。 - 若影像具有週期性:
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 的效果說明
-
constant(預設模式)- 邊界區域填充為
0(黑色),導致邊界變暗。
- 邊界區域填充為
-
edge- 邊界區域使用最接近的像素值填充,邊界的變化較硬。
-
reflect- 影像邊界會鏡像反射,保持較自然的邊界過渡。
-
symmetric- 與
reflect類似,但反射發生在邊界本身,使邊界稍微平滑。
- 與
-
wrap- 影像邊界循環到另一側,適合週期性影像(但對一般影像可能產生奇怪的邊界)。
這段程式碼能夠直觀地看到不同 mode 的影響,並幫助你選擇最適合的方式來保留影像特徵

留言板
歡迎留下建議與分享!希望一起交流!感恩!