如何从高斯减去像素,除以高斯,并在 imagemagick 中归一化
How do I subtract pixels from Gaussian, divide by Gaussian, and normalize in imagemagick
我很清楚我想做什么,并且可以用 python、scipy 和 PIL 来完成。
我想使用 imagemagick,因为它是专门为这些操作设计的。
- T为最高合法强度(0,当然最低)
- 将图像输入名为 I 的临时 MPC
- 高斯模糊 I 并存储到名为 G 的临时 MPC 中
- 减除 D = (I - G) / G
- 获取最大值 M = max (T * abs(D))
- 偏移、归一化和缩放 O = T * (D + M) / (2 * M)
- 输出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
我很清楚我想做什么,并且可以用 python、scipy 和 PIL 来完成。 我想使用 imagemagick,因为它是专门为这些操作设计的。
- T为最高合法强度(0,当然最低)
- 将图像输入名为 I 的临时 MPC
- 高斯模糊 I 并存储到名为 G 的临时 MPC 中
- 减除 D = (I - G) / G
- 获取最大值 M = max (T * abs(D))
- 偏移、归一化和缩放 O = T * (D + M) / (2 * M)
- 输出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