如何修复PNG';使用ImageMagick的伽马射线?

如何修复PNG';使用ImageMagick的伽马射线?,imagemagick,png,imagemagick-convert,gamma,Imagemagick,Png,Imagemagick Convert,Gamma,我想将PNG的gamma值固定为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.png和new.png,但它们看起来不同 我猜公式,(1/4

我想将PNG的gamma值固定为
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.png
new.png
,但它们看起来不同

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

谢谢

编辑:

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

首先,我有下图。这张图片的gAMA约为0.227(1/4.4)。

然后,我需要这个图像。图像的gAMA为0.4545(1/2.2),但外观与上面的相同

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


在Imagemagick中,只需使用-set gamma:

convert image.png -set gamma 0.4545 image.png
这只会更改gamma值,但不会更改像素值。如果您需要这样做,那么您应该使用(正如Mark Setchell所建议的)。但是,如果您想要1/2.2并拥有1/4.4,则需要(1/2.2)/(1/4.4)=2的值


convert image.png-gamma 2 image.png

我已经做了更多的实验,我不确定这个答案是否正确,但我会把它留一段时间,以便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)方式更改gamma参数:

正如您所看到的,两种方法都没有改变像素值本身,两种方法都改变了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

仅针对将来的读者,如果您希望更改像素值本身而不仅仅是gamma参数,请执行以下操作:

# 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)

这在Imagemagick中似乎对我有效

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

。。。 伽马:0.4545
如果你的图像的gamma值为4.4,你可以用
-gamma 0.227272
删除它(因为它是1/4.4),然后用
-gamma 2.2
应用一个新的gamma值2.2。嗯,我尝试了你的建议,如下所示
$convert orig.png-gamma 0.227272 orig.png&&convert orig.png-gamma 2.2 orig.png
但处理后的图像不是我想要的。我写了一个额外的解释,请看一看:)谢谢你的评论!我尝试了
$convert image.png-gamma 2 image.png
,但它不起作用。我写了另外一个解释,请看:)你试过
convert image.png-set gamma 0.4545 image.png吗
是的,我试过了。但是命令只是设置了gamma值。我从来没有看到第二张照片的样子。啊,真的。。。这和我第一次写的命令差不多。可能我遇到的真正问题并不是伽玛射线的根本原因
convert red44.png -gamma 0.5 -set gamma 0.4545 red22_new.png
identify -verbose red22_new.png