将图像转换为灰度返回了一个奇怪的图像
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)
我尝试使用加权求和公式将 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)