使用numpy将图像转换为灰度

时间:2018-07-11 12:33:45

标签: python arrays numpy opencv

我有一个由三元组(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

3 个答案:

答案 0 :(得分:2)

这是一个有效的代码:

return sgMail.send(msg);

答案 1 :(得分:1)

您可以使用点积:

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)

答案 2 :(得分:0)

使用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')

Example results

文字示例(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]])

我们也可以使用与上面相同的代码来可视化此简单示例:

Smaller example

其他建议

如果您想应用自己的自定义函数,则可以使用apply_along_axis,但是您应该考虑使用更纯粹的numpy方法,例如{{3}建议的方法。 },或者如果可能的话,只需使用cv2选项加载黑白图像:

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