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

Posted

技术标签:

【中文标题】将枕头图像转换为灰度的 Gamma 校正【英文标题】:Gamma correction with Pillow Image turning to Grayscale 【发布时间】:2022-01-20 08:09:43 【问题描述】:

尝试在 dash 应用中对图像执行 gamma 校正。但是经过我的功能后,原始彩色图像变成了灰度。我使用 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 表示调色板。我怀疑你想要那个。你把指数弄混了。并且你有循环接触单个像素,当这可以使用 numpy 在一个表达式中表达时 我尝试了几乎所有可用的模式,但无法让它返回经过伽马校正的原始彩色图像。它只返回灰度版本。 内循环体只触及每个像素的[0],也就是红色分量。并且您的循环从 1 开始,而像素坐标从 0 开始。所有其他的东西(请求、图形、...)都会分散注意力。编写一个获取图像并返回图像的函数,除了改变伽玛之外什么都不做。 我更新了我的代码。这是你的意思吗? 是的,我就是这个意思。 【参考方案1】:

记住“P”和“RGB”是不一样的。 P 是调色板模式,限制为 256 色。

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

您似乎正在保存图像,所有颜色值都在一个通道中,这意味着您最终会得到一个通道 = 1 的图像(宽度、高度、通道)。 这也是使用 Image.new("RGB",...) 时会得到红色图像的原因,因为您的图像只有第一个通道 (R) 中的数据


@ChristophRackwitz 在他的两个 cmets 中都是正确的。大多数情况下,处理图像的库实际上会处理尺寸(高度、宽度、通道),因此如果您从磁盘加载图像,例如 (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 维数组。检查每个通道的值在之前和之后是否符合预期

【讨论】:

所以如果我使用 Image.new("L"...) 一切都按预期工作,但当然它是灰度的。我怎样才能保持原来的颜色? if 你的意思是在 numpy 的意义上指定一个shape,它是(height, width, channels),注意高度然后宽度的顺序,而不是先宽后高。 至于如何让它上色...我已经暗示过了。你的代码不完整。您还需要处理每个像素的绿色和蓝色值。你还没有这样做。 显然是图像处理的新手,不知道您的意思。 @moe92 编辑了我的答案以添加更多信息

以上是关于将枕头图像转换为灰度的 Gamma 校正的主要内容,如果未能解决你的问题,请参考以下文章

Gamma Correction/Gamma校正/灰度校正/亮度校正

数字图像处理matlab中gamma变化的参数对图像影响

将视频转换为单张图片(灰度)【MATLAB】

转换语音就像将彩色图像转换为灰度?

将图像转换为灰度

matlab将视频帧转换成灰度图程序解释