首页 > 解决方案 > 使用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 语句确定每个像素是否更接近白色或黑色,然后将它们相应地转换为。但我得到的结果是一张略显高光的照片,而不是一张完整的黑白照片,我想知道我做错了什么步骤?

标签: pythonif-statement

解决方案


要获得黑色,所有 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

推荐阅读