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()

上述程式將生成以下輸出。

Opening and Writing to Image Files

任何原始格式的影像都是矩陣格式中數字表示的顏色組合。機器只根據這些數字來理解和操作影像。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()

上述程式將生成以下輸出。

Cropping Operation Image Files

我們還可以執行一些基本操作,例如將影像上下翻轉,如下所述。

# 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()

上述程式將生成以下輸出。

Image Turning Operation

除此之外,我們還有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()

上述程式將生成以下輸出。

Image Rotation Operation

濾波器

讓我們討論濾波器如何幫助影像處理。

什麼是影像處理中的濾波?

濾波是一種修改或增強影像的技術。例如,您可以過濾影像以強調某些特徵或去除其他特徵。使用濾波實現的影像處理操作包括平滑、銳化和邊緣增強。

濾波是一種鄰域操作,其中輸出影像中任何給定畫素的值是透過對相應輸入畫素鄰域中的畫素值應用某種演算法來確定的。現在讓我們使用 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()

上述程式將生成以下輸出。

Image Blurring Operation

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()

上述程式將生成以下輸出。

Edge Detection

影像看起來像一個色塊。現在,我們將檢測這些色塊的邊緣。這裡,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()

上述程式將生成以下輸出。

Edge Detection-2
廣告