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

執行上面示例代碼,得到以下輸出結果 -
Scipy

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

執行上面示例代碼,得到以下結果 -

Scipy

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

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

執行上面示例代碼,得到以下結果 -

Scipy

除此之外,還有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

濾鏡

下面來看看濾鏡如何應用在圖像處理中。

圖像處理中的濾鏡是什麼?

濾鏡是一種修改或增強圖像的技術。例如,可以過濾圖像以強調某些功能或刪除其他功能。通過濾鏡實現的圖像處理操作包括平滑,銳化和邊緣增強。

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

執行上面示例代碼,得到以下結果 -
Scipy

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

執行上面示例代碼,得到以下結果 -
Scipy

圖像看起來像一個方塊的顏色。現在,檢測這些彩色塊的邊緣。這裏,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()

執行上面示例代碼,得到以下結果 -
Scipy

以下是糾正/補充內容:

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