给定已知的背景色(#000)和已知的前景色(#fff),如何计算不透明度以匹配参考图像?

时间:2019-07-09 19:27:25

标签: svg colors imagemagick

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

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

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%。看起来如下:

enter image description here

这在我眼中看起来是黑色的(第49帧的值为0%)。

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

enter image description here

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

很明显,像素亮度类似于黑色背景上白色的不透明度。数字本身是,因为我的曲线以正确的速率逐渐消失,但是它开始变得更亮,并逐帧保持更亮,直到它们都达到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

0 个答案:

没有答案