2

我确切地知道我想做什么,并且可以使用 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 文档词汇似乎是为图像处理专业人士准备的,这超出了我的理解。

4

4 回答 4

2

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

在此处输入图像描述

如果这不正确(与您的 python 等方法不匹配,请发布并输入和输出示例,然后我可能能够更正任何错误的假设或错误并使其正常工作。

如果想使用 Imagemagick 6,则必须编译或获得 Q16 HDRI 编译的版本。然后在上面的命令中,只要把magick改成convert即可。

于 2018-01-18T23:45:53.433 回答
0

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

#!/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 实现了目标。

于 2018-01-19T11:15:40.940 回答
0

更正:

我在以前的帖子中犯了一个错误。当使用 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


在此处输入图像描述

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

于 2018-01-19T23:08:32.473 回答
0

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


在此处输入图像描述

于 2018-01-20T03:24:58.357 回答