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
的影響,並幫助你選擇最適合的方式來保留影像特徵
留言板
歡迎留下建議與分享!希望一起交流!感恩!