【问题标题】:Precise adjusting of two colours simultaneously via manipulation with brightness, contrast and gamma通过亮度、对比度和伽玛控制同时精确调整两种颜色
【发布时间】:2018-01-29 22:16:00
【问题描述】:

我有一张黑白图像,必须在屏幕上呈现为精确颜色的灰度图像。黑色应显示为 rgb(40,40,40),白色应显示为 rgb(128,128,128)。

问题是渲染此图像的软件不允许直接指定颜色;我可以改变的唯一参数是亮度、对比度和伽玛(不能将图像转换为所需的颜色)。

是否有任何公式可以计算这些参数的特定值以根据要求调整颜色?

【问题讨论】:

    标签: image image-processing colors


    【解决方案1】:

    在不知道它们如何计算亮度和对比度的情况下,很难告诉您如何进行计算。

    也许我还是误会了。但是您可以使用 Imagemagick 找到图像中的最小值和最大值

    convert image -format %[fx:255*minima] info: 
    
    convert image -format %[fx:255*maxima] info:
    

    这些将在 0 到 255 的范围内。

    正如上面 Mark 所示,变换是线性的。所以它服从方程

    Y = a*X + b
    

    其中 a 是对比度的量度,b 是亮度的量度; X 是您的输入值,Y 是您想要的输出值。

    这样

    Ymax = a*Xmax + b
    

    Ymin = a*Xmin + b
    

    减去并求解a,我们得到

    a = (Ymax-Ymin)/(Xmax-Xmin)
    

    并将其代入方程中的 Ymax 并保存为 b,我们得到

    b = Ymax - a*Xmax = Ymax - ( (Ymax-Ymin)/(Xmax-Xmin) )*Xmax
    

    那么你就可以使用Imagemagick函数-function polynomial来处理你的图像了。

    在unix中,我会这样做

    Xmin=$(convert image -format %[fx:255*minima] info:)
    
    Xmax=$(convert image -format %[fx:255*maxima] info:)
    

    如果你的图像是纯黑色和纯白色,那么你可以跳过上面的,直接使用

    Xmin=0
    
    Xmax=255
    

    你想要的值是

    Ymin=40
    
    Ymax=128
    

    这些现在是变量,我可以使用 -fx 来计算 a 和 b

    a = $(convert xc: -format "%[fx:($Ymax-$Ymin)/($Xmax-$Xmin)]" info:)
    
    b = $(convert xc: -format "%[fx:$Ymax - $a*$Xmax]" info:)
    

    并转换您的图像,

    convert image -function polynomial "$a,$b" result image
    

    【讨论】:

    • 不错的答案!请让他们来。
    • @fmw42 非常感谢!您的详细解释正是我所希望的。你的公式有效,我的问题(顺便说一句,对我来说非常严重)终于解决了。
    • 非常好 - 请考虑通过单击计票旁边的空心复选标记(勾号)来接受 Fred 的回答(这个)。祝你的项目好运!
    • 没问题,点击它。谢谢!
    【解决方案2】:

    一般来说,有几种方法可以改变图像的对比度、伽玛值和亮度,很难知道您选择的工具使用哪种方法,因此很难提供正确的答案。

    您要做的是将下图中的蓝线(对比度或亮度没有变化)移动到红线(对比度降低)所在的位置:

    一般来说,降低对比度会旋转蓝线顺时针增加它会旋转逆时针。一般来说,增加亮度会将蓝线移动右边,而减少 亮度移动向左。更改 gamma 可能会使线变成曲线。

    你可以在命令行中使用 ImageMagick 吗?

    convert input.png +level 15.69%,50.2% -depth 8 result.png
    

    如果您拥有 v7+,请使用 magick 代替 convert


    我为你做了一点渐变:

    convert -size 60x255 gradient: -rotate 90 gradient.png
    

    如果你应用建议的命令:

    convert gradient.png +level 15.69%,50.2% -depth 8 result.png
    

    你会得到这个:

    您可以通过以下方式检查统计信息(最小值和最大值):

    identify -verbose result.png | more
    
    Image: result.png
      Format: PNG (Portable Network Graphics)
      Mime type: image/png
      Class: PseudoClass
      Geometry: 255x60+0+0
      Units: Undefined
      Type: Grayscale
      Base type: Palette
      Endianess: Undefined
      Colorspace: Gray
      Depth: 8-bit
      Channel depth:
        Gray: 8-bit
      Channel statistics:
        Pixels: 15300
        Gray:
          min: 40 (0.156863)                        <--- MIN looks good
          max: 128 (0.501961)                       <--- MAX looks good
          mean: 84.0078 (0.329443)
          standard deviation: 25.5119 (0.100047)
          kurtosis: -1.19879
          skewness: 0.000197702
    

    【讨论】:

    • @MarkSetchell这仅适用于量子范围为 0 到 255 的 Q8 安装 imagemagick。对于 Q16,默认情况下,您需要在 0 到 65535 的量子范围内指定 -level 的值. 我总是建议使用百分比来实现可移植性。所以 40 到 100*40/255=15.69% 和 128 到 100*128/255=50.20%。见imagemagick.org/script/command-line-options.php#level。 -depth 不会强制 -level 使用 0 到 255 的值进行 Q16 编译。它只设置输出图像范围的值。
    • @fmw42 非常感谢您的更正。我试图改进我的答案。
    • 感谢您的建议,但是,也许,我没有说清楚,这不是关于如何正确转换图像。由于版权问题,我无论如何都不允许修改它们。而且,那些图像文件不是 bmp 或 tiff 什么的。将使用特殊软件来显示它们(我想是故意的)。软件允许更改的唯一渲染参数是亮度、对比度和伽玛。所以我的问题是关于公式(想知道它是否存在);如何计算这些参数的值以调整颜色,如我在原始帖子中所述。
    • @MarkSetchell 我在您更新答案之前写了我的评论(或者我刷新了此页面)。不幸的是,它没有回答我的问题,但我只是想让您知道,无论如何我都非常感谢您的解释。
    • @MarkSetchell 谢谢你,马克!我非常感谢您的帮助,并感谢您所花费的时间。你和 fmw42 对我帮助很大。
    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2019-03-23
    • 2014-02-13
    相关资源
    最近更新 更多