Pillow Image 转灰度的 Gamma 校正

Gamma correction with Pillow Image turning to Grayscale

正在尝试对 dash 应用程序中的图像执行伽玛校正。但是经过我的功能后,原始彩色图像变成了灰度。我使用 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。 这也是为什么在使用 Image.new("RGB",...) 时得到红色图像的原因,因为您的图像仅在第一个通道 (R)

中有数据

@ChristophRackwitz 的两条评论都是正确的。大多数情况下,处理图像的库实际上处理尺寸(高度、宽度、通道),因此如果您从磁盘加载图像,例如 (1920,1080,3),内存中的对象实际上具有尺寸 (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 维数组。在

之前和之后检查每个通道的值是否符合预期