如何从高斯减去像素,除以高斯,并在 imagemagick 中归一化

How do I subtract pixels from Gaussian, divide by Gaussian, and normalize in imagemagick

我很清楚我想做什么,并且可以用 python、scipy 和 PIL 来完成。 我想使用 imagemagick,因为它是专门为这些操作设计的。

  1. T为最高合法强度(0,当然最低)
  2. 将图像输入名为 I 的临时 MPC
  3. 高斯模糊 I 并存储到名为 G 的临时 MPC 中
  4. 减除 D = (I - G) / G
  5. 获取最大值 M = max (T * abs(D))
  6. 偏移、归一化和缩放 O = T * (D + M) / (2 * M)
  7. 输出O成文件名output.png

我无法从联机文档中弄清楚如何执行此操作。 Imagemagick 文档词汇似乎是为了 图像处理专业人士,这超出了我的理解。

我已尝试在 Imagemagick 中重现您的命令,但我不确定结果或 T 和 M 是否应在 0 到 1 或 0 到 Quantumrange 范围内(Q16 HDRI IM 编译为 0 到 65535) .我在 Imagemagick logo: image using 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)

如果这不正确(与您的 python 等方法不符,请 post 输入和输出示例,然后我可能会纠正任何错误的假设或错误并使其工作相同。

如果想使用 Imagemagick 6,则必须编译或获取 Q16 HDRI 编译版本。然后在上面的命令中,只需将magick更改为convert即可。

这里是一个bash处理脚本 转换识别的任何 0-255 图像文件。 我在自己的一些示例文件上进行了尝试。 有效。

#!/bin/bash

echo $#
if [ $# -ne 1 ]
then
    echo "Usage: [=10=] {imagefilename}"
elif [ -f "" ]
then
    T="255"
    sigma=5
    convert  .I.mpc
    convert .I.mpc -blur 0x$sigma .G.mpc
    convert .I.mpc .G.mpc +swap -compose minus -composite .G.mpc +swap -compose divide -composite .D.mpc
    M=`convert .D.mpc .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 .D.mpc -evaluate add $M -evaluate divide $M2 -evaluate multiply $T .mdif.png
else
    echo "Usage: [=10=] {imagefilename}\n!exists "
fi

我曾希望 imagemagick 命令是 更容易阅读和理解,但 fmw42 达到了目标。

更正:

我在之前的帖子中犯了一个错误。当使用 HDRI 并需要保持负值或 0 到 quantumrange 范围之外的值时,任何复合操作都将默认钳制并给出结果,就好像 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


结果与我之前的结果有点不同。

这是使用 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