python - 使用if语句将图片变为黑白以确定像素
问题描述
def black_and_white(img: Image) -> Image:
img_width, img_height = img.size
pixels = img.load() # create the pixel map
# for every pixel
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
if r < 255/2:
r = 0
else:
r = 255
if g < 255/2:
g = 0
else:
g = 255
if b < 255/2:
b = 0
else:
b = 255
pixels[i, j] = (r, g, b)
return img
使用枕头我尝试将彩色图像转换为黑白图像,使用 if 语句确定每个像素是否更接近白色或黑色,然后将它们相应地转换为。但我得到的结果是一张略显高光的照片,而不是一张完整的黑白照片,我想知道我做错了什么步骤?
解决方案
要获得黑色,所有 3 个颜色分量必须为 0。对于白色,所有 3 个颜色分量必须为 255。目前,您的代码分别设置每个颜色分量,因此您可以获得诸如 (255, 0,0) 将显示为红色。像这样的东西应该会给你一个黑白图像。
def black_and_white(img: Image) -> Image:
img_width, img_height = img.size
pixels = img.load() # create the pixel map
# for every pixel
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
if (r+g+b) < 3*255/2:
r = 0
g = 0
b = 0
else:
r = 255
g = 255
b = 255
pixels[i, j] = (r, g, b)
return img
这不会产生看起来非常“自然”的黑白图像,因为人眼将不同的颜色感知为比其他颜色更强烈,因此例如绿色会比等量的红色看起来“更白”。执行此操作的常用公式(此处提供更多详细信息)如下:
if 0.299 * r + 0.587 * g + 0.114 * b < 255/2:
r = 0
g = 0
b = 0
else:
r = 255
g = 255
b = 255