在ImageMagick中,是否可以根据区域进行-auto-gamma?

时间:2014-06-24 20:50:53

标签: imagemagick

我正在使用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应用于指定的区域。是否有可能做我希望的事情?谢谢你的建议!

1 个答案:

答案 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