【发布时间】:2018-01-29 22:16:00
【问题描述】:
我有一张黑白图像,必须在屏幕上呈现为精确颜色的灰度图像。黑色应显示为 rgb(40,40,40),白色应显示为 rgb(128,128,128)。
问题是渲染此图像的软件不允许直接指定颜色;我可以改变的唯一参数是亮度、对比度和伽玛(不能将图像转换为所需的颜色)。
是否有任何公式可以计算这些参数的特定值以根据要求调整颜色?
【问题讨论】:
标签: image image-processing colors
我有一张黑白图像,必须在屏幕上呈现为精确颜色的灰度图像。黑色应显示为 rgb(40,40,40),白色应显示为 rgb(128,128,128)。
问题是渲染此图像的软件不允许直接指定颜色;我可以改变的唯一参数是亮度、对比度和伽玛(不能将图像转换为所需的颜色)。
是否有任何公式可以计算这些参数的特定值以根据要求调整颜色?
【问题讨论】:
标签: image image-processing colors
在不知道它们如何计算亮度和对比度的情况下,很难告诉您如何进行计算。
也许我还是误会了。但是您可以使用 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
【讨论】:
一般来说,有几种方法可以改变图像的对比度、伽玛值和亮度,很难知道您选择的工具使用哪种方法,因此很难提供正确的答案。
您要做的是将下图中的蓝线(对比度或亮度没有变化)移动到红线(对比度降低)所在的位置:
一般来说,降低对比度会旋转蓝线顺时针而增加它会旋转它逆时针。一般来说,增加亮度会将蓝线移动到右边,而减少 亮度将移动它向左。更改 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 编译。它只设置输出图像范围的值。