【发布时间】: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)。它不会提供相同的结果。
-
确实如此。您还需要像在代码中所做的那样转换为
intdtype,并且似乎您正在跳过最后一行和最后一行,所以用零填充。 -
-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').