
- SciPy 教程
- SciPy - 首頁
- SciPy - 簡介
- SciPy - 環境搭建
- SciPy - 基本功能
- SciPy - 聚類
- SciPy - 常量
- SciPy - FFTpack
- SciPy - 積分
- SciPy - 插值
- SciPy - 輸入和輸出
- SciPy - 線性代數 (Linalg)
- SciPy - N維影像
- SciPy - 最佳化
- SciPy - 統計
- SciPy - 壓縮稀疏圖 (CSGraph)
- SciPy - 空間
- SciPy - 正交距離迴歸 (ODR)
- SciPy - 特殊函式包
- SciPy 有用資源
- SciPy - 參考
- SciPy - 快速指南
- SciPy - 有用資源
- SciPy - 討論
SciPy - N維影像
SciPy 的 ndimage 子模組專門用於影像處理。這裡,ndimage 指的是 n 維影像。
影像處理中最常見的一些任務如下:
- 輸入/輸出,顯示影像
- 基本操作 - 裁剪、翻轉、旋轉等。
- 影像濾波 - 降噪、銳化等。
- 影像分割 - 標記對應於不同物件的畫素
- 分類
- 特徵提取
- 配準
讓我們討論如何使用 SciPy 實現其中一些功能。
開啟和寫入影像檔案
SciPy 的misc 包包含一些影像。我們使用這些影像來學習影像操作。讓我們考慮以下示例。
from scipy import misc f = misc.face() misc.imsave('face.png', f) # uses the Image module (PIL) import matplotlib.pyplot as plt plt.imshow(f) plt.show()
上述程式將生成以下輸出。

任何原始格式的影像都是矩陣格式中數字表示的顏色組合。機器只根據這些數字來理解和操作影像。RGB 是一種流行的表示方法。
讓我們看看上面影像的統計資訊。
from scipy import misc face = misc.face(gray = False) print face.mean(), face.max(), face.min()
上述程式將生成以下輸出。
110.16274388631184, 255, 0
現在,我們知道影像是由數字組成的,因此任何數字值的改變都會改變原始影像。讓我們對影像執行一些幾何變換。最基本的幾何操作是裁剪。
from scipy import misc face = misc.face(gray = True) lx, ly = face.shape # Cropping crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4] import matplotlib.pyplot as plt plt.imshow(crop_face) plt.show()
上述程式將生成以下輸出。

我們還可以執行一些基本操作,例如將影像上下翻轉,如下所述。
# up <-> down flip from scipy import misc face = misc.face() flip_ud_face = np.flipud(face) import matplotlib.pyplot as plt plt.imshow(flip_ud_face) plt.show()
上述程式將生成以下輸出。

除此之外,我們還有rotate() 函式,它可以將影像旋轉指定的角度。
# rotation from scipy import misc,ndimage face = misc.face() rotate_face = ndimage.rotate(face, 45) import matplotlib.pyplot as plt plt.imshow(rotate_face) plt.show()
上述程式將生成以下輸出。

濾波器
讓我們討論濾波器如何幫助影像處理。
什麼是影像處理中的濾波?
濾波是一種修改或增強影像的技術。例如,您可以過濾影像以強調某些特徵或去除其他特徵。使用濾波實現的影像處理操作包括平滑、銳化和邊緣增強。
濾波是一種鄰域操作,其中輸出影像中任何給定畫素的值是透過對相應輸入畫素鄰域中的畫素值應用某種演算法來確定的。現在讓我們使用 SciPy ndimage 執行一些操作。
模糊
模糊廣泛用於減少影像中的噪點。我們可以執行濾波操作並檢視影像的變化。讓我們考慮以下示例。
from scipy import misc face = misc.face() blurred_face = ndimage.gaussian_filter(face, sigma=3) import matplotlib.pyplot as plt plt.imshow(blurred_face) plt.show()
上述程式將生成以下輸出。

sigma 值表示模糊級別,範圍為五。我們可以透過調整 sigma 值來檢視影像質量的變化。有關模糊的更多詳細資訊,請點選 → 數字影像處理 (DIP) 教程。
邊緣檢測
讓我們討論邊緣檢測如何幫助影像處理。
什麼是邊緣檢測?
邊緣檢測是一種影像處理技術,用於查詢影像中物體的邊界。它透過檢測亮度的不連續性來工作。邊緣檢測用於影像分割和資料提取,應用領域包括影像處理、計算機視覺和機器視覺。
最常用的邊緣檢測演算法包括:
- Sobel
- Canny
- Prewitt
- Roberts
- 模糊邏輯方法
讓我們考慮以下示例。
import scipy.ndimage as nd import numpy as np im = np.zeros((256, 256)) im[64:-64, 64:-64] = 1 im[90:-90,90:-90] = 2 im = ndimage.gaussian_filter(im, 8) import matplotlib.pyplot as plt plt.imshow(im) plt.show()
上述程式將生成以下輸出。

影像看起來像一個色塊。現在,我們將檢測這些色塊的邊緣。這裡,ndimage 提供了一個名為Sobel的函式來執行此操作。而 NumPy 提供了Hypot 函式來將兩個結果矩陣組合成一個。
讓我們考慮以下示例。
import scipy.ndimage as nd import matplotlib.pyplot as plt im = np.zeros((256, 256)) im[64:-64, 64:-64] = 1 im[90:-90,90:-90] = 2 im = ndimage.gaussian_filter(im, 8) sx = ndimage.sobel(im, axis = 0, mode = 'constant') sy = ndimage.sobel(im, axis = 1, mode = 'constant') sob = np.hypot(sx, sy) plt.imshow(sob) plt.show()
上述程式將生成以下輸出。
