如何解决将图像转换为灰度返回一个奇怪的图像
我尝试使用加权求和公式将 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,1])+(.114*img[i,2])
i = Image.fromarray(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] = 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)
,
据我所知,PIL 图像以 uint8
格式存储,因此您只需将 i = Image.fromarray(bw,'L')
替换为 i = Image.fromarray(np.uint8(bw),'L')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。