如何使用ImageMagick修复PNG的伽玛?

时间:2018-03-23 12:00:16

标签: imagemagick png imagemagick-convert gamma

我想将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 个答案:

答案 0 :(得分:1)

这似乎对Imagemagick有用。

convert red44.png -gamma 0.5 -set gamma 0.4545 red22_new.png

enter image description here

identify -verbose red22_new.png

... 伽玛:0.4545 ...

答案 1 :(得分: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

答案 2 :(得分:0)

我一直在尝试更多,我不确定这个答案是否正确,但我会留下一段时间,以便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)

现在让我们以我的方式或弗雷德(@ fmw42)方式更改gamma参数:

# 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编码器&# 39; s伽马。一些实验表明你需要:

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)