代码之家  ›  专栏  ›  技术社区  ›  ueneid

如何使用ImageMagick修复PNG的gamma?

  •  2
  • ueneid  · 技术社区  · 6 年前

    我想将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) ,是错误的。有人知道正确的方法吗?

    谢谢

    已编辑:

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

    首先,我有下图。这张图片的伽马值约为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 回复  |  直到 5 年前
        1
  •  1
  •   fmw42    6 年前

    这在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 。。。

        2
  •  0
  •   fmw42    6 年前

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

    convert image.png -set gamma 0.4545 image.png
    

    这只会更改gamma值,但不会更改像素值。如果需要这样做,那么应该使用(正如马克·塞切尔所建议的)。但如果需要1/2.2,并且有1/4.4,则需要(1/2.2)/(1/4.4)=2的值

    转换图像。png-gamma 2图像。巴布亚新几内亚

        3
  •  0
  •   Mark Setchell    6 年前

    我已经做了更多的实验,我不确定这个答案是否正确,但我会把它留一段时间,以便弗雷德、埃里克和格伦(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参数:

    # 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 内部gamma,但至关重要的是两者都没有完成您需要的操作,即更改PNG编码器的gamma。进行一点实验就可以看出您需要:

    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)