使用 imagemagick 迭代计算图像子集的平均数

使用 imagemagick 迭代计算图像子集的平均数

我有一百张图片,我想每次取 5 张的平均值。

前5个imagemagick命令是:

convert -background transparent %d.jpg[1-5] -average output1.jpg

第二个 5 的 imagemagick 命令是:

convert -background transparent %d.jpg[2-6] -average output2.jpg

第三个5的imagemagick命令是:

convert -background transparent %d.jpg[3-7] -average output3.jpg

我如何在 Windows 中以编程方式执行此操作?换句话说,我可以编写一个批处理文件来运行 imagemagick 以循环执行此操作吗?或者有更好的语言/方法/替代方案吗?

答案1

使用如下的批处理文件可以很容易地完成此操作:

@echo off
setlocal enabledelayedexpansion
for /l %%f in (1,1,5) do (
    set /a cnt=%%f+4

    REM If the output looks ok, remove the "echo" from the following line to actually run convert
    echo convert -background transparent %%d.jpg[%%f-!cnt!] -average output%%f.jpg
)
endlocal

以下是带有“echo”的输出:

convert -background transparent %d.jpg[1-5] -average output1.jpg
convert -background transparent %d.jpg[2-6] -average output2.jpg
convert -background transparent %d.jpg[3-7] -average output3.jpg
convert -background transparent %d.jpg[4-8] -average output4.jpg
convert -background transparent %d.jpg[5-9] -average output5.jpg

提示:一定要指定 imagemagick 的 convert.exe 的完整路径,否则 Windows 自己的转变命令(将 FAT 卷转换为 NTFS)可能会默认运行。

答案2

下面是我拼凑的代码,可作为用于处理数千幅图像的 Windows 批处理文件:

  1. rem 我们将合并 5 张图片
  2. 设置/a U=0
  3. 设置/a V=1
  4. 设置/a W=2
  5. 设置/a X=3
  6. 设置/a Y=4
  7. rem 我们只会查看前 15 张图片
  8. 设置/a 终止符=15
  9. :环形
  10. 设置/a W= %W% + 1
  11. 设置/a V= %V% + 1
  12. 设置/a U= %U% + 1
  13. 设置/a X=%X% + 1
  14. 设置/a Y= %Y% + 1
  15. 如果 %Y%==%terminator% 则关闭
  16. 转到打开
  17. :关闭
  18. 暂停
  19. 出口
  20. :打开
  21. 转换 %%d.jpg[%U%-%Y%] -average -auto-level %U%out.jpg
  22. 转到循环

使用循环时,有些事情比较奇怪for next,需要记住设置延迟局部表达式,并!在变量名周围使用感叹号 ( ) 字符而不是百分号。在我回到这里并看到您已经解决了我的问题之前,我已经独立学习了这一点。使用循环的简单 goto 更透明,尽管 for 语句更优雅。

相关内容