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
值,可以看到影象品質的變化。
討論邊緣檢測如何幫助影象處理。
什麼是邊緣檢測?
邊緣檢測是一種用於查詢影象內物體邊界的影象處理技術。它通過檢測亮度不連續性來工作。邊緣檢測用於諸如影象處理,計算機視覺和機器視覺等領域的影象分割和資料提取。
最常用的邊緣檢測演算法包括 -
看看下面的一個例子。
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