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 维数组。在
之前和之后检查每个通道的值是否符合预期
正在尝试对 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 维数组。在
之前和之后检查每个通道的值是否符合预期