将枕头图像转换为灰度的 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 校正的主要内容,如果未能解决你的问题,请参考以下文章