繁体   English   中英

将枕头图像转换为灰度的 Gamma 校正

[英]Gamma correction with Pillow Image turning to Grayscale

尝试在仪表板应用程序中对图像执行伽马校正。 但经过我的 function 后,原始彩色图像变为灰度。 我使用 Pillow Image.new("P", ...)作为颜色而不是 "L" 用于灰度。 如果我使用Image.new("RGB",...)返回的图像是红色的。 请帮忙。

def gamma_correct(gamma, url):
    im = Image.open(requests.get(url, stream=True).raw)
    
    gamma1 = gamma
    row = im.size[0]
    col = im.size[1]
    result_img1 = Image.new("RGB", (row, col))
    for x in range(1 , row):
        for y in range(1, col):
            r = pow(im.getpixel((x,y))[0]/255, (1/gamma1))*255
            g = pow(im.getpixel((x,y))[1]/255, (1/gamma1))*255
            b = pow(im.getpixel((x,y))[2]/255, (1/gamma1))*255
            result_img1.putpixel((x,y)[0], int(r))
            result_img1.putpixel((x,y)[1], int(g))
            result_img1.putpixel((x,y)[2], int(b))

请记住“P”和“RGB”是不一样的。 P 是调色板模式,仅限于 256 种颜色。

彩色图像具有以下维度:(宽度、高度、通道),通道通常 = 3。

似乎您正在保存图像,所有颜色值都在一个通道中,这意味着您最终会得到一个通道 = 1 的图像,例如 (width, tall, channels)。这也是您在以下情况下获得红色图像的原因您使用 Image.new("RGB",...),因为您的图像仅在第一个通道 (R) 中具有数据


@ChristophRackwitz 在他的两个评论中都是正确的。 大多数情况下,处理图像的库实际上会处理尺寸(高度、宽度、通道),因此如果您从磁盘加载图像,例如 (1920,1080,3),memory 中的 object 实际上具有尺寸 (1080,1920 ,3)。 此外,一些软件(如 opencv)甚至默认将通道视为 BGR 而不是 RGB

RGB 图像有 3 个通道,它们是每种颜色的值。 这意味着对于图像中的每个像素,有3 个颜色值,一个用于红色通道 (R),一个用于绿色 (G),一个用于蓝色 (B)

尝试调试图像修改过程,即:

for x in range(1 , row):
    for y in range(1, col):
            print(im.getpixel(x,y))
            r = pow(im.getpixel((x,y))[0]/255, (1/gamma1))*255
            g = pow(im.getpixel((x,y))[1]/255, (1/gamma1))*255
            b = pow(im.getpixel((x,y))[2]/255, (1/gamma1))*255
            print(im.getpixel(x,y))

两个打印语句将打印一个 3 维数组。 检查每个通道的值是否符合预期,无论是之前还是之后

兄弟,错误是您只将一个通道(即 R)参数传递给 putpixel() 方法。 您需要传递一个 RGB 值的元组。

def gamma_correct(gamma, path):
    im = Image.open(path)
    gamma1 = gamma
    row = im.size[0]
    col = im.size[1]
    result_img1 = Image.new(mode="RGB", size=(row, col), color=0)
    for x in range(row):
        for y in range(col):
            r = pow(im.getpixel((x, y))[0] / 255, (1 / gamma1)) * 255
            g = pow(im.getpixel((x, y))[1] / 255, (1 / gamma1)) * 255
            b = pow(im.getpixel((x, y))[2] / 255, (1 / gamma1)) * 255
            # add
            color = (int(r), int(g), int(b))
            result_img1.putpixel((x, y), color)
    #show
    result_img1.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM