将图像转换为灰度返回了一个奇怪的图像

Converting image to grayscale returned a weird image

我尝试使用加权求和公式将 rgb 图像转换为灰度图像

Y' = 0.299 R' + 0.587 G' + .114 B'

它没有给出任何错误,但我无法理解输出。 这是代码:

img = Image.open("dog.jpg")
img = img.resize((256, 256), resample=Image.BILINEAR)
img = np.array(img)
bw = np.zeros((256,256))
for i in range(256):
    for j in range(256):
        bw[i,j] = (.299*img[i,j,0])+(.587*img[i,j,1])+(.114*img[i,j,2])
i = Image.fromarray(bw,'L')

这是我得到的输出图片:

据我了解,PIL 图像以 uint8 格式存储,因此您可以将 i = Image.fromarray(bw,'L') 替换为 i = Image.fromarray(np.uint8(bw),'L')

您在 bw[i,j] 中的计算结果为浮点数。图像需要 uint8 类型,即 0-255 范围内的整数。修复此更改

bw = np.zeros((256,256))

bw = np.zeros((256,256), dtype=np.uint8)

这会将 0-0.999... 中的每个数字剪裁为 0。

>>> bw[0,0] = 0.3
>>> bw[0,0]
0
>>> bw[0,0] = 0.6
>>> bw[0,0]
0

如果您更关心舍入到最接近的整数而不是总是向下舍入,那么您也可以将该计算包装在 np.round().

>>> bw[0,0] = np.round(0.3)
>>> bw[0,0]
0
>>> bw[0,0] = np.round(0.6)
>>> bw[0,0]
1

Numpy 支持矢量化,因此您无需编写显式循环(也较慢)。

img = np.array(img)
bw = np.round(.299 * img[...,0] + .587 * img[...,1] + .114 * img[...,2]).astype(np.uint8)