在ImageMagick中,是否可以基于区域自动生成gamma?

在ImageMagick中,是否可以基于区域自动生成gamma?,imagemagick,Imagemagick,我正在使用ImageMagick为timelapse视频准备一组约20000张照片。timelapse视频中的一个常见问题是闪烁,这是由于照明条件的变化、云层的移动、色调的变化等造成的 我使用IM将每个图像转换为灰度和自动伽马,这是对照明“稳定性”的极大改进。很好,但还不够完美。 我现在想做下面的事情,但不知道怎么做 1. determine ideal auto gamma based only on the lower 30% of the image 2. apply that ideal

我正在使用ImageMagick为timelapse视频准备一组约20000张照片。timelapse视频中的一个常见问题是闪烁,这是由于照明条件的变化、云层的移动、色调的变化等造成的

我使用IM将每个图像转换为灰度和自动伽马,这是对照明“稳定性”的极大改进。很好,但还不够完美。 我现在想做下面的事情,但不知道怎么做

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应用于指定的区域。有可能做到我所希望的吗?谢谢你的建议

是的,我想是的

您可以像这样裁剪图像底部30%的区域:

convert image.jpg -gravity south -crop x30%+0+0 bottom.jpg
convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean]" info:
echo "scale=4; l($mean30/$qr)/l(0.5)" | bc -l
这意味着您可以得到图像底部30%的平均值,如下所示:

convert image.jpg -gravity south -crop x30%+0+0 bottom.jpg
convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean]" info:
echo "scale=4; l($mean30/$qr)/l(0.5)" | bc -l
你也可以一次性得到量子范围,如果你加上:

convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean] %[fx:quantumrange]" info:
现在,gamma被定义为平均值的对数除以动态范围中点的对数,但我们可以将这两个数字归一化为范围[0-1],如下所示:

log(mean/quantumrange) / log(0.5)
因此,我们将让
bc
为我们解决这个问题,如下所示:

convert image.jpg -gravity south -crop x30%+0+0 bottom.jpg
convert image.jpg -gravity south -crop x30%+0+0 -format "%[mean]" info:
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
#/bin/bash
#选择图像名称作为参数
图像=$1
#获取图像底部30%的平均值和量子范围(Q16为65535,Q8为255)

这很漂亮。非常感谢。我要补充的是,如果你有20000个图像要纠正,你可以考虑使用GNU并行来获得所有CPU核并行工作。您可以首先
mkdir output
创建一个输出目录,然后更改脚本的最后一行,使其写入
“output\$image”
,而不是
out.jpg
。然后运行
ls*.jpg | parallel-j8b30gamma{}
以并行使用8个CPU核。现在它更像是40000个,所以这更有用。再次感谢。我希望我能投更多的票。