在 Python 中轉換影象為灰度
-
在 Python 中使用
pillow
庫的image.convert()
方法將影象轉換為灰度影象 -
在 Python 中使用
scikit-image
模組的color.rgb2gray()
方法將影象轉換為灰度 -
在 Python 中使用
OpenCV
庫的cv2.imread()
方法將影象轉換為灰度 -
在 Python 中使用轉換公式和
Matplotlib
庫將影象轉換為灰度影象
本教程將講解用 Python 將影象轉換為灰度影象的各種方法。灰度影象是指單個畫素代表光量或只包含光強度資訊的影象。它是一種單維影象,只具有不同的灰度顏色。
由於灰度影象是單維的,所以在各種問題中以及 Canny 邊緣檢測等演算法中,灰度影象被用來降低模型的訓練複雜性。
本文將探討我們如何在 Python 中使用 Python 模組的各種方法將影象轉換為灰度或將影象讀為灰度。
在 Python 中使用 pillow
庫的 image.convert()
方法將影象轉換為灰度影象
image.convert(mode, ..)
方法將影象作為輸入,並將其轉換為 mode
引數中指定的所需影象型別。模式包括 1 位和 8 位畫素的黑白影象、RGB
影象、HSV
影象、BGR
影象和 LAB
影象等。
由於我們要將影象轉換為灰度影象,我們可以傳遞 1
作為模式引數,表示 1 位黑白模式,L
表示 8 位黑白影象,LA
表示 alpha 模式。下面的示例程式碼演示瞭如何在 Python 中使用 pillow
庫的 image.convert()
方法將影象轉換為灰度。
from PIL import Image
img = Image.open('test.jpg')
imgGray = img.convert('L')
imgGray.save('test_gray.jpg')
原始影象。
轉換的灰度影象。
在 Python 中使用 scikit-image
模組的 color.rgb2gray()
方法將影象轉換為灰度
color.rgb2gray()
將 RGB 格式的影象作為輸入,並返回輸入影象的灰度副本。下面的程式碼示例演示瞭如何使用 scikit-image
模組中的 color.rgb2gray()
方法在 Python 中獲取一個灰度影象。
from skimage import color
from skimage import io
img = io.imread('test.jpg')
imgGray = color.rgb2gray(img)
在 Python 中使用 OpenCV
庫的 cv2.imread()
方法將影象轉換為灰度
另一種獲取灰度影象的方法是直接讀取灰度模式下的影象,我們可以使用 OpenCV
庫中的 cv2.imread(path, flag)
方法來讀取灰度影象。
假設 cv2.imread()
方法的 flag
值等於 1,在這種情況下,它將讀取不包括 alpha 通道的影象,如果 0
則讀取灰度影象,如果等於 -1
方法則讀取包括 alpha 通道資訊的影象。
因此,我們可以使用 imread()
方法,通過將 flag
引數值傳遞為 1
,從給定的路徑中讀取影象為灰度影象。
下面的示例程式碼演示瞭如何使用 cv2.imread()
方法在 Python 中讀取灰度影象。
import cv2
imgGray = cv2.imread('test.jpg',0)
在 Python 中使用轉換公式和 Matplotlib
庫將影象轉換為灰度影象
我們還可以使用標準的 RGB 到灰度的轉換公式將影象轉換為灰度,即 imgGray = 0.2989 * R + 0.5870 * G + 0.1140 * B
。
我們可以使用 Python 中的 Matplotlib
庫來實現這個方法,首先我們需要使用 mpimg.imread()
方法來讀取影象,然後得到 RGB 影象的紅、藍、綠三個維度的矩陣,得到矩陣後我們就可以對它們應用公式來得到灰度影象。我們需要將完整的矩陣與公式中給出的值相乘,得到灰度影象。
下面的程式碼示例演示了我們如何在 Python 中使用 Matplotlib
庫實現 RGB 到灰度的轉換公式。
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('test.jpg')
R, G, B = img[:,:,0], img[:,:,1], img[:,:,2]
imgGray = 0.2989 * R + 0.5870 * G + 0.1140 * B
plt.imshow(imgGray, cmap='gray')
plt.show()