圖像處理和分析通常被看作是對二維值數組的操作。然而,在一些領域中,必須對高維數的圖像進行處理分析,例如,醫學成像和生物成像。由於對多維特性的良好支持,numpy非常適合這種類型的應用程序。scipy.ndimage包提供了許多通用的圖像處理和分析功能,這些功能支持操作任意維度的數組。
scipy.ndimage中提供了圖像矩陣變換、圖像濾波、圖像卷積等功能。
旋轉圖片
旋轉圖片,可以使用ndimage.rotate函數。
測試圖片下載: face.png
示例
加載原圖片
from scipy import ndimage import matplotlib.image as mpimg import matplotlib.pyplot as plt # 加載圖片 face = mpimg.imread('./face.png') # 顯示圖片 plt.imshow(face) # plt.savefig('./img2-1.png') # 保存要顯示的圖片 plt.show()
輸出
示例
from scipy import ndimage import matplotlib.image as mpimg import matplotlib.pyplot as plt # 加載圖片 face = mpimg.imread('./face.png') # 旋轉圖片 rotate_face = ndimage.rotate(face, 45) plt.imshow(rotate_face) # plt.savefig('./img3-1.png') # 保存要顯示的圖片 plt.show()
輸出
圖像濾波
圖像濾波是一種修改/增強圖像的技術。例如,可以圖像濾波突出圖像的某些特性,弱化或刪除圖像的另一些特性。濾波有很多種,例如:平滑、銳化、邊緣增強等等。
示例
對圖像進行高斯濾波。高斯濾波是一種模糊濾波,廣泛用於濾除圖像噪聲。
from scipy import ndimage import matplotlib.image as mpimg import matplotlib.pyplot as plt # 加載圖片 face = mpimg.imread('./face.png') # 處理圖片 face1 = ndimage.gaussian_filter(face, sigma=3) # 顯示圖片 plt.imshow(face1) # plt.savefig('./img4-1.png') # 保存要顯示的圖片 plt.show()
輸出
sigma=3
表示模糊程度為3,我們可以通過調整sigma值,來比較圖像質量的變化。
邊緣檢測
邊緣檢測是一種尋找圖像中物體邊界的圖像處理技術。它的原理是通過檢測圖像中的亮度突變,來識別物體邊緣。邊緣檢測在圖像處理、計算機視覺、機器視覺等領域中廣泛應用。
常用邊緣檢測算法包括:
- Sobel
- Canny
- Prewitt
- Roberts
- Fuzzy Logic methods
讓我們考慮下面的例子。
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 = nd.gaussian_filter(im, 8) import matplotlib.pyplot as plt plt.imshow(im) # plt.savefig('./img5-1.png') # 保存要顯示的圖片 plt.show()
上面的程序將生成以下輸出。
圖像看起來像一個正方形的色塊,我們將檢測這些彩色塊的邊緣。這里使用ndimage的Sobel函數來檢測圖像邊緣,該函數會對圖像數組的每個軸分開操作,產生兩個矩陣,然后我們使用NumPy中的Hypot函數將這兩個矩陣合並為一個矩陣,得到最后結果。
示例
import scipy.ndimage as nd import numpy as np import matplotlib.pyplot as plt im = np.zeros((256, 256)) im[64:-64, 64:-64] = 1 im[90:-90,90:-90] = 2 im = nd.gaussian_filter(im, 8) sx = nd.sobel(im, axis = 0, mode = 'constant') sy = nd.sobel(im, axis = 1, mode = 'constant') sob = np.hypot(sx, sy) plt.imshow(sob) # plt.savefig('./img6-1.png') # 保存要顯示的圖片 plt.show()
上面的程序將生成以下輸出。