我正在使用ImageMagick为一段间隔拍摄视频准备一组约20,000张照片。由于光照条件的变化,云层的变化,色调的变化等,间隔拍摄视频中的一个常见问题是闪烁。
我使用IM将每个图像转换为灰度和-auto-gamma
,这是照明“稳定性”的显着改善。很好,但还不完美。
我现在想做以下事情,但无法弄清楚如何。
1. determine ideal auto gamma based only on the lower 30% of the image
2. apply that ideal gamma to the entire image
我的每张照片都有天空和下面的建筑物。当云层经过时,天空会发生巨大变化,但建筑物的照明相当稳定。
我尝试了-region
,但正如预期的那样,它只将gamma应用于指定的区域。是否有可能做我希望的事情?谢谢你的建议!
答案 0 :(得分:3)
是的,我想是的。
您可以像这样裁剪图像的底部30%:
convert image.jpg -gravity south -crop x30%+0+0 bottom.jpg
这意味着你可以得到图像底部30%的平均值:
convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean]" info:
如果您将其添加到:
,您也可以一次性获得量子范围convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean] %[fx:quantumrange]" info:
现在,伽玛被定义为平均值的对数除以动态范围中点的对数,但我们可以将这两个数值标准化为[0-1]范围,如下所示:
log(mean/quantumrange) / log(0.5)
所以我们让bc
为我们解决这个问题:
echo "scale=4; l($mean30/$qr)/l(0.5)" | bc -l
我们可以使用其结果对整个图像应用伽玛校正。所以,我把所有这些放在一个脚本中,我称之为b30gamma
。您以该名称保存它,然后键入:
chmod +x b30gamma
使其可执行。然后你可以在这样的图像上运行它,结果将保存为out.jpg
,以免破坏输入图像:
./b30gamma input.jpg
这是脚本:
#!/bin/bash
# Pick up image name as parameter
image=$1
# Get mean of bottom 30% of image, and quantum range (65535 for Q16, or 255 for Q8)
read mean30 qr < <(convert "$image" -gravity south -crop x30%+0+0 -format "%[mean] %[fx:quantumrange]" info:)
# Gamma = log(mean)/log(dynamic range centre point)
gcorr=$(echo "scale=4;l($mean30/$qr)/l(0.5)" | bc -l)
# Debug
echo Image: $image, Mean: $mean30, quantum range: $qr, Gamma: $gcorr
# Now apply this gamma to entire image
convert "$image" -gamma $gcorr out.jpg