ImageMagick использует альфа-канал для контроля расчета минимальных, максимальных и средних значений изображения - PullRequest
0 голосов
/ 19 ноября 2018

ImageMagick команда identify выводит на экран минимальное, максимальное и среднее значения всех пикселей изображения - например, для изображения RGB TIF мы можем видеть среднее , таким образом:

identify -verbose -quiet image.tif | grep mean

который перечисляет (для красного, зеленого, синего и серого):

mean: 122.974 (0.48225)
mean: 107.722 (0.422438)
mean: 84.1278 (0.329913)
mean: 104.941 (0.411534)

Q: если мое изображение имеет логический альфа-канал, могу ли я использовать его для ограничения вычислений, чтобы включить только те пиксели, для которых альфа была установлена ​​на 1?

Я пытался использовать опцию clip-mask с лидирующим - или +, но средства не изменились, как ожидалось.

1 Ответ

0 голосов
/ 19 ноября 2018

В ImageMagick, масштаб 1x1! Функция может быть использована для вычисления среднего значения без включения альфа, так что вы получите среднее значение только непрозрачных значений. Таким образом, вы можете сделать следующее:

Создание тестового прозрачного изображения:

convert logo: -transparent white logot.png


Вычислить средние значения:

convert logot.png -scale 1x1! -alpha off -format "%[fx:255*u.r], %[fx:255*u.g], %[fx:255*u.b]" info:

100.202, 81.4747, 98.6342


Кроме того, вы можете использовать альфа-канал в качестве маски для получения средств. Вы вычисляете среднее значение для каждого канала без альфа-канала, а фон под альфа-каналом устанавливается черным. Затем вычислите среднее значение альфа-канала. Затем разделите среднее значение каждого канала на среднее значение альфа-канала.

convert logo: -transparent white logot.png
convert logot.png -alpha extract alpha.png

means_rgb=$(convert logot.png -background black -alpha background -alpha off -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]" info:)
mean_r=$(echo $means_rgb | cut -d, -f1)
mean_g=$(echo $means_rgb | cut -d, -f2)
mean_b=$(echo $means_rgb | cut -d, -f3)

mean_alpha=$(convert alpha.png -format "%[fx:mean]" info:)

mean_r=$(convert xc: -format "%[fx:255*$mean_r/$mean_alpha]" info:)
mean_g=$(convert xc: -format "%[fx:255*$mean_g/$mean_alpha]" info:)
mean_b=$(convert xc: -format "%[fx:255*$mean_b/$mean_alpha]" info:)

echo "$mean_r, $mean_g, $mean_b"

100.203, 81.4768, 98.6362


Чтобы получить мин и макс, взяв реплику из идеи Марка Сетчелла:

convert logot.png -background black -alpha background -alpha off -format "%[fx:255*maxima.r], %[fx:255*maxima.g], %[fx:255*maxima.b]\n" info:

255, 250, 244


convert logot.png -background white -alpha background -alpha off -format "%[fx:255*minima.r], %[fx:255*minima.g], %[fx:255*minima.b]\n" info:

4, 0, 0


...