Scipy Ndimage


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
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)

face = misc.face(gray = False)
print (face.mean(), face.max(), face.min())

執行上面範例程式碼,得到以下結果 -

110.162743886 255 0

現在,我們已經知道影象是由數位組成的,所以數位值的任何變化都會改變原始影象。接下來對影象執行一些幾何變換。基本的幾何操作是裁剪 -

from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
face = misc.face(gray = True)
lx, ly = face.shape

crop_face = face[int(lx/4): -int(lx/4), int(ly/4): -int(ly/4)]

import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()

執行上面範例程式碼,得到以下結果 -

也可以執行一些基本的操作,例如像下面描述的那樣倒置影象。參考以下程式碼 -

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值表示5級模糊程度。通過調整sigma值,可以看到影象品質的變化。

邊緣檢測

討論邊緣檢測如何幫助影象處理。

什麼是邊緣檢測?

邊緣檢測是一種用於查詢影象內物體邊界的影象處理技術。它通過檢測亮度不連續性來工作。邊緣檢測用於諸如影象處理,計算機視覺和機器視覺等領域的影象分割和資料提取。

最常用的邊緣檢測演算法包括 -

  • 索貝爾(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()

執行上面範例程式碼,得到以下結果 -


以下是糾正/補充內容:

個人覺得註冊應該改為配準更合適一點  提交時間:2019-08-10