首页 > 解决方案 > 给定已知的背景颜色 (#000) 和已知的前景色 (#fff),我如何计算不透明度以匹配参考图像?

问题描述

我有一个以完美黑色背景开头的短视频剪辑。在短时间内,它将以全白字幕过渡。中间帧显示各种灰色调。

在另一个 SO question 中,我找到了一个单线,可以让我找到最亮的像素:

convert 0000$a.png -colorspace HSB -format %c histogram:info:-  | sort -t',' -gr -k 3 | head -1 | sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/

在我的视频帧范围内,我得到了一个从 0 到 100 的漂亮对数曲线。我想我可以将这些数字放入 svg 的文本元素不透明度中,然后导出一个 png。

但是,结果与我试图模仿的原始结果大不相同。第 50 帧的亮度为 8.49447%。它如下所示:

在此处输入图像描述

这在我看来是黑色的(第 49 帧测量为 0%)。

如果我将白色文本设置为 8.49% 的不透明度,我会得到以下结果:

在此处输入图像描述

这仍然很暗,但更容易察觉。

显然,像素亮度与黑色背景上的白色不透明度不同。数字本身是正确的,因为我的曲线以看起来合适的速度淡入,但它开始变得更亮并逐帧保持更亮,直到它们都达到 100%。

我可以将此值转换为匹配的不透明度吗?我是否需要完全不同的值?如果这只是几帧,我只会盯着它们看,但我有一些看起来像低千的东西来正确(用于各种场景)。

我正在使用的命令行如下:

for a in `seq -f %06g 50 72`; do o=`convert $a.png -colorspace HSB -format %c histogram:info:-  | sort -t',' -gr -k 3 | head -1 | sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/'`; p=0`echo "scale=6;$o/100"|bc -l`; sed "s|ABC|$p|" ../svg/scene000.svg > ../temp.svg; /Applications/Inkscape.app/Contents/Resources/bin/inkscape -f /Users/user/ep1/temp.svg -e /Users/user/ep1/4k/$a.png -z > /dev/null; echo -e "$a.png\t$o\t\t$p"; done

我看到了这些帧的值:

000050.png  8.49447     0.084944
000051.png  11.0702     0.110702
000052.png  16.6186     0.166186
000053.png  27.7847     0.277847
000054.png  32.5076     0.325076
000055.png  40.0663     0.400663
000056.png  46.6477     0.466477
000057.png  52.6319     0.526319
000058.png  62.2218     0.622218
000059.png  64.1088     0.641088
000060.png  71.5642     0.715642
000061.png  76.4314     0.764314
000062.png  81.3782     0.813782
000063.png  81.3782     0.813782
000064.png  85.1114     0.851114
000065.png  85.1114     0.851114
000066.png  88.8427     0.888427
000067.png  91.8013     0.918013
000068.png  93.7057     0.937057
000069.png  94.4534     0.944534
000070.png  97.7247     0.977247
000071.png  97.7247     0.977247
000072.png  99.8274     0.998274

标签: svgcolorsimagemagick

解决方案


推荐阅读