Как вычесть пиксели из гауссовского, разделить на гауссовский и нормализовать в imagemagick
Я точно знаю, что я хочу сделать, и могу сделать это с помощью Python, Scipy и PIL. Я хочу использовать imagemagick, так как он разработан специально для этих действий.
- T самая высокая юридическая интенсивность (0, конечно, самая низкая)
- Введите изображение во временный MPC с именем I
- Размытие по Гауссу I и сохранение во временном MPC с именем G
- Вычтите и разделите D = (I - G) / G
- Получите максимум M = max (T * abs(D))
- Смещение, нормализация и масштабирование O = T * (D + M) / (2 * M)
- Выведите O в имя файла output.png
Я не могу понять, как это сделать из онлайн-документации. Кажется, словарь документации Imagemagick предназначен для специалистов по манипулированию изображениями, и это за пределами моего понимания.
4 ответа
Вот исправленный метод в виде одной длинной командной строки с использованием Imagemagick 7.0.7.21 Q16 HDRI.
T="65000"
sigma=5
magick \
\( logo: -write mpr:imgI +delete \) \
\( mpr:imgI -blur 0x$sigma -write mpr:imgG +delete \) \
\( mpr:imgI mpr:imgG +swap -define compose:clamp=off -compose minus -composite mpr:imgG +swap -define compose:clamp=off -compose divide -composite -write mpr:imgD +delete \) \
\( mpr:imgD mpr:imgD -define compose:clamp=off -compose multiply -composite -evaluate pow 0.5 -evaluate multiply $T -write mpr:imgT +delete \) \
mpr:imgT -set option:mm "%[fx:maxima]" -set option:nn "%[fx:2*maxima]" +delete mpr:imgD -evaluate add "%[mm]" -evaluate divide "%[nn]" -evaluate multiply $T output3.png
Я пытался воспроизвести ваши команды в Imagemagick, но я не уверен в результате или о том, должны ли T и M находиться в диапазоне от 0 до 1 или от 0 до Quantumrange (от 0 до 65535 для компиляции HDRI IM Q16). Я тестировал логотип Imagemagick: изображение с использованием Imagemagick 7.0.7.21 Q16 HDRI.
T="65000"
sigma=5
magick logo: I.mpc
magick I.mpc -blur 0x$sigma G.mpc
magick I.mpc G.mpc +swap -compose minus -composite G.mpc +swap -compose divide -composite D.mpc
M=`magick D.mpc D.mpc -compose multiply -composite -evaluate pow 0.5 -evaluate multiply $T -format "%[fx:maxima]" info:`
M2=`magick xc: -format "%[fx:2*$M]" info:`
magick D.mpc -evaluate add $M -evaluate divide $M2 -evaluate multiply $T output.png
Line 1: Set T=65000 (range 0 to 65355)
Line 2: Set gaussian blur sigma to 5
Line 3: Read the input into I.mpc
Line 4: Apply gaussian blur to I.mpc to create G.mpc
Line 5: Create D=(I-G)/G (requires HDRI IM 7 compile to keep negative values)
Line 6: Compute M=T*Max(sqrt(D*D)) as a single number variable in the range 0 to 65535 (Quantumrange for 16-bit IM compile)
Line 7: Compute 2*M as variable M2
Line 8: Compute output O = T * (D + M) / (2 * M)
Если это неверно (не соответствует вашему питону и т. Д., Подходу, то, пожалуйста, опубликуйте и пример ввода и вывода, и тогда я смогу исправить любые ложные предположения или ошибки и заставить его работать так же.
Если вы хотите использовать Imagemagick 6, нужно будет скомпилировать или получить версию, скомпилированную с HDRI Q16. Затем в приведенных выше командах просто измените магию для преобразования.
Вот скрипт bash для обработки любого файла изображения 0-255, распознаваемого программой convert. Я попробовал это на некоторых моих собственных файлах. Оно работает.
#!/bin/bash
echo $#
if [ $# -ne 1 ]
then
echo "Usage: ${0} {imagefilename}"
elif [ -f "$1" ]
then
T="255"
sigma=5
convert ${1} ${1}.I.mpc
convert ${1}.I.mpc -blur 0x$sigma ${1}.G.mpc
convert ${1}.I.mpc ${1}.G.mpc +swap -compose minus -composite ${1}.G.mpc +swap -compose divide -composite ${1}.D.mpc
M=`convert ${1}.D.mpc ${1}.D.mpc -compose multiply -composite -evaluate pow 0.5 -evaluate multiply $T -format "%[fx:maxima]" info:`
M2=`convert xc: -format "%[fx:2*$M]" info:`
convert ${1}.D.mpc -evaluate add $M -evaluate divide $M2 -evaluate multiply $T ${1}.mdif.png
else
echo "Usage: ${0} {imagefilename}\n!exists ${1}"
fi
Я надеялся, что команды imagemagick будут легче читать и легче понимать, но fmw42 достиг цели.
ИСПРАВЛЕНИЕ:
Я сделал ошибку в моих предыдущих постах. При использовании HDRI и необходимости сохранять отрицательные значения или значения вне диапазона от 0 до квантового диапазона, любые составные операции по умолчанию будут фиксироваться и давать результаты, как если бы HDRI не был включен. Таким образом, необходимо добавить определения перед составными операциями, чтобы не допустить фиксации (ограничения) к нормальным пределам динамического диапазона без HDRI. Таким образом, правильный код будет выглядеть следующим образом:
T="65000"
sigma=5
magick logo: I.mpc
magick I.mpc -blur 0x$sigma G.mpc
magick I.mpc G.mpc +swap -define compose:clamp=off -compose minus -composite G.mpc +swap -define compose:clamp=off -compose divide -composite D.mpc
M=`magick D.mpc D.mpc -define compose:clamp=off -compose multiply -composite -evaluate pow 0.5 -evaluate multiply $T -format "%[fx:maxima]" info:`
M2=`magick xc: -format "%[fx:2*$M]" info:`
magick D.mpc -evaluate add $M -evaluate divide $M2 -evaluate multiply $T output.png
Результат немного отличается от моих предыдущих результатов.