簡體   English   中英

使用 numpy 將圖像轉換為灰度

[英]Converting an image to grayscale using numpy

我有一個由三元組(r,g,b)numpy.array矩陣nxm表示的圖像,我想使用我自己的函數將其轉換為灰度。

我的嘗試無法將矩陣nxmx3轉換為單值矩陣nxm ,這意味着從數組[r,g,b]我得到[gray, gray, gray]但我需要gray

即初始顏色通道: [150 246 98] 轉換為灰色后: [134 134 134] 我需要什么: 134

我怎樣才能做到這一點?

我的代碼:

def grayConversion(image):
    height, width, channel = image.shape
    for i in range(0, height):
        for j in range(0, width):
            blueComponent = image[i][j][0]
            greenComponent = image[i][j][1]
            redComponent = image[i][j][2]
            grayValue = 0.07 * blueComponent + 0.72 * greenComponent + 0.21 * redComponent
            image[i][j] = grayValue
    cv2.imshow("GrayScale",image)
    return image

這是一個工作代碼:

def grayConversion(image):
    grayValue = 0.07 * image[:,:,2] + 0.72 * image[:,:,1] + 0.21 * image[:,:,0]
    gray_img = grayValue.astype(np.uint8)
    return gray_img

orig = cv2.imread(r'C:\Users\Jackson\Desktop\drum.png', 1)
g = grayConversion(orig)

cv2.imshow("Original", orig)
cv2.imshow("GrayScale", g)
cv2.waitKey(0)
cv2.destroyAllWindows()

您可以使用點積:

gray_image = image.dot([0.07, 0.72, 0.21])

或者甚至只是手動完成整個操作:

b = image[..., 0]
g = image[..., 1]
r = image[..., 2]
gray_image = 0.21 * r + 0.72 * g + 0.07 * b

不要忘記轉換回 0-255:

gray_image = np.min(gray_image, 255).astype(np.uint8)

使用apply_along_axis解決方案

一個解決方案可以通過使用apply_along_axis來實現:

import numpy as np
def grayscale(colors):
    """Return grayscale of given color."""
    r, g, b = colors
    return 0.07 * r + 0.72 * g + 0.21 * b

image = np.random.uniform(255, size=(10,10,3))
result = np.apply_along_axis(grayscale, 2, image)

例子

10x10 圖像

我們現在可以繼續可視化結果:

from matplotlib import pyplot as plt
plt.subplot(1,2,1)
plt.imshow(image)
plt.subplot(1,2,2)
plt.imshow(result, cmap='gray')

示例結果

文本示例(2x2 圖像)

為了在文本中可視化實際結果,我將使用一個較小的數組,只是一個2x2 的圖像:

image = np.random.uniform(250, size=(2,2,3))

內容是:

array([[[205.02229826, 109.56089703, 163.74868594],
    [ 11.13557763, 160.98463727, 195.0294515 ]],

   [[218.15273335,  84.94373737, 197.70228018],
    [ 75.8992683 , 224.49258788, 146.74468294]]])

讓我們使用我們的自定義函數將其轉換為灰度:

result = np.apply_along_axis(grayscale, 2, image)

轉換的輸出是:

array([[127.62263079, 157.64461409],
   [117.94766108, 197.76399547]])

我們也可以使用與上面相同的代碼來可視化這個簡單的例子:

較小的例子

進一步的建議

如果您想應用自己的自定義函數,那么apply_along_axisapply_along_axis的方法,但您應該考慮使用更純的 numpy 方法,例如Eric建議的方法,或者如果可能,只需使用cv2選項加​​載黑白圖像:

cv2.imread('smalltext.jpg',0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM