如何使用ImageMagick修复PNG图像的Gamma?

3

我希望将PNG的伽马值固定为1/2.2。例如,假设有一张png图像,其gAMA值为1/4.4。由于某些原因,我必须将该值固定为1/2.2。因此,我尝试使用以下命令convert

# 0.5 is led by (1/4.4)/(1/2.2)
# 0.45455 is led by 1/2.2
$ convert orig.png -gamma 0.5 +gamma 0.45455 new.png

然后,我比较了两张图片,orig.pngnew.png,但它们看起来不同。

我猜公式(1/4.4)/(1/2.2)是错误的。有人知道正确的方法吗?

谢谢。

编辑:

对不起,也许我没能告诉你我真正想做什么。所以,我添加了更多信息和示例图像。

首先,我有下面这张图片。这张图片的gAMA值约为0.227(1/4.4)。 This image's gAMA value is 0.227(1/4.4)

然后,我需要这张图片。这张图片的gAMA是0.4545(1/2.2),但外观与上面那张相同。

This image is what I want

所以,我不需要这张图片。这张图片的gAMA值也是0.4545(1/2.2),但外观与第一张不同。

This image's gAMA value is 0.4545(1/2.2)


3
如果您的图像具有4.4的伽马值,您可以使用“-gamma 0.227272”将其去除(因为这是1/4.4),然后使用“-gamma 2.2”应用新的2.2伽马值。 - Mark Setchell
嗯,我尝试了你的建议,像下面这样。 $ convert orig.png -gamma 0.227272 orig.png && convert orig.png -gamma 2.2 orig.png 但是处理后的图像不是我想要的。我写了一个额外的说明,请看一下 :) - ueneid
尝试使用-set gamma而不是-gamma。 - fmw42
3个回答

2
这对我在Imagemagick中有效。
convert red44.png -gamma 0.5 -set gamma 0.4545 red22_new.png

enter image description here

identify -verbose red22_new.png

... Gamma: 0.4545 ...


啊,确实……这几乎和我最初写的命令一样。也许我真正遇到的问题似乎不是伽马是根本原因。无论如何,非常感谢! - ueneid

1

我一直在做一些实验,但我不确定这个答案是否正确。我会让Fred、Eric和Glenn (@GlennRandersPehrson)看到它,也许他们可以纠正或评论它。我也不明白为什么会出现这种情况:

convert start.png -set png:gAMA 2 -verbose info: | grep -i -C5 gam

与此不同的是:
convert start.png -set png:gAMA 2 tmp.png
identify -verbose tmp.png | grep -i -C5 gam

我想我知道发生了什么-简而言之,我认为PNG编码器没有正确地捕捉到伽马值。
让我们制作一个单像素值为100的图像,以便在变换时看到它发生了什么:
convert xc:"gray(100)" start.png

让我们检查它:
convert start.png txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700)  #646464  gray(100)

是的,它绝对是100。让我们检查伽马值:
identify -verbose start.png | grep -i gam
Gamma: 0.45455
png:gAMA: gamma=0.45455 (See Gamma, above)

现在让我们改变伽马参数,可以使用我的方法或者Fred (@fmw42)的方法:
# Change gamma parameter my way
convert start.png +gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png +gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700)  #646464  gray(100)


# Change gamma parameter Fred's way
convert start.png -set gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png -set gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700)  #646464  gray(100)

正如您所看到的,这两种方式都没有改变像素值本身,两种方式都改变了ImageMagick内部伽马值,但关键是它们都没有完成您需要的任务,即更改PNG编码器的伽马值。一些实验表明您需要:
convert start.png -set png:gAMA 2 -verbose info: | grep -i gam
Gamma: 0.45455
png:gAMA: 2

所以,我认为这就是答案——即使用:

convert input.png -set png:gAMA XYZ result.png

仅供未来读者参考,如果您想更改像素值本身而不仅仅是伽马参数,请执行以下操作:

# Set gamma of 2, initial pixel value 100 becomes 160
convert start.png -gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (41039.6)  #A0A0A0  gray(160)

# Set gamma of 0.5, initial pixel value 100 becomes 39
convert start.png -gamma 0.5 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (10078.4)  #272727  gray(39)

0
在Imagemagick中,只需使用-set gamma:
convert image.png -set gamma 0.4545 image.png

这只是简单地改变了伽马值,但并没有改变像素值。如果您需要这样做,那么您应该使用(正如Mark Setchell建议的那样)。但是,如果您想要1/2.2而有1/4.4,则需要一个值为(1/2.2)/(1/4.4)= 2

convert image.png -gamma 2 image.png


谢谢您的评论!我尝试了 $ convert image.png -gamma 2 image.png ,但它不起作用。我写了一个额外的解释,请看一下 :) - ueneid
你尝试过使用 convert image.png -set gamma 0.4545 image.png 吗? - fmw42
是的,我做了。但是这个命令只是设置了伽马值。我从未得到第二张图片的外观。 - ueneid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接