Python機器學習(六十一)SciPy 圖像處理


圖像處理和分析通常被看作是對二維值數組的操作。然而,在一些領域中,必須對高維數的圖像進行處理分析,例如,醫學成像和生物成像。由於對多維特性的良好支持,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()

輸出

scipy.ndimage pic1

示例

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

輸出

scipy.ndimage pic2

圖像濾波

圖像濾波是一種修改/增強圖像的技術。例如,可以圖像濾波突出圖像的某些特性,弱化或刪除圖像的另一些特性。濾波有很多種,例如:平滑、銳化、邊緣增強等等。

示例

對圖像進行高斯濾波。高斯濾波是一種模糊濾波,廣泛用於濾除圖像噪聲。

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

輸出

scipy.ndimage pic3

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

上面的程序將生成以下輸出。

scipy.ndimage pic5

圖像看起來像一個正方形的色塊,我們將檢測這些彩色塊的邊緣。這里使用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()

上面的程序將生成以下輸出。

scipy.ndimage pic6


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM