【问题标题】:Python3 reduce array from (x,y,3) to (x,y,1) (rgb to greyscale) [duplicate]Python3将数组从(x,y,3)减少到(x,y,1)(rgb到灰度)[重复]
【发布时间】:2026-01-06 12:10:02
【问题描述】:

我对python很陌生,因此我可能会冒重复的风险(但我还不知道如何在网上问)。

我编写了以下方法。它将数组(ROWS,COLS,3) 转换为数组(ROWS,COLS,1)

def convert_greyscale( rgb ):
    rgb_greyscale = np.zeros( (rgb.shape[0],rgb.shape[1]), dtype=np.uint8)
    for row in range(0, rgb.shape[0]:
        for col in range(0, rgb.shape[1]):
            rgb_greyscale[row][col] = int(0.2126 * rgb[row][col][0] + 0.7152 * rgb[row][col][1] + 0.0722 * rgb[row][col][2])
    return rgb_greyscale

遗憾的是,我无法更短地复制它。已经有一个帖子有人提到了 np.dot 的解决方案,但是它与我的小函数的结果不同。

如何使用更高效的 (lambda) 或至少更优雅的表达式重写此代码?

这种方法有效吗?

【问题讨论】:

  • 只需在此处使用适当的权重:[0.2126, 0.7152, 0.0722] 以及链接问题的答案,特别是这个 - *.com/a/12201744
  • 是的,我也找到了这个解决方案,(提到 np.dot)。它不会提供相同的结果。
  • 确实如此。您还需要像在代码中所做的那样转换为int dtype,并且似乎您正在跳过最后一行和最后一行,所以用零填充。
  • -1 不正确。忘了删除它。所以基本上与这个答案不同的是: np.dot(rgb[...,:3], [0.299, 0.587, 0.114]).astype(np.uint8) ?
  • 不确定您指的是哪个-1。这很简单:np.dot(rgb, [0.2126, 0.7152, 0.0722]).astype('uint8').

标签: python arrays numpy


【解决方案1】:

你可以简单地使用:

return (0.2126*rgb[:,:,0]+0.7152*rgb[:,:,1]+0.0722*rgb[:,:,2])\
           .astype(np.uint8)

这里不需要循环,让 numpy 进行迭代。

【讨论】:

  • 哦,谢谢!看起来简单而优雅。