【问题标题】:How to auto-crop a barrel-distorted image using ImageMagick?如何使用 ImageMagick 自动裁剪桶形失真图像?
【发布时间】:2015-02-25 13:00:50
【问题描述】:

使用 ImageMagick 的 convert 对照片进行桶形失真以校正明显可见的枕形失真,我提供了正的 a、b 或 c 值(来自我的镜头 + 焦距的数据库)。这导致图像经过校正,具有原始宽度和高度,但包括非矩形、弯曲/扭曲的边界,因为图像向其中心进行了校正。简化示例:

convert rose: -virtual-pixel black -distort Barrel '+0.0 +0.1 +0.0' out.png

如何自动将黑色、弯曲的边框裁剪为玫瑰内原始纵横比中可能最大的矩形?

ImageMagick 网站说,参数“d”是自动计算的,可以做到这一点(导致线性失真有效地放大图像并将弯曲的边框推到图像边界之外),但是 imagemagick 计算的值似乎针对不同的东西(ubuntu 12.04上的v6.6.9)。如果我猜测并手动指定一个“d”,我可以得到预期的结果:

convert rose: -virtual-pixel black -distort Barrel '+0.0 +0.1 +0.0 +0.6' out.png

对于我的裁剪案例,给定的公式 a+b+c+d=1 似乎不是合适的 d。此外,d 似乎取决于图像的纵横比,而不仅取决于 a/b/c。如何让 ImageMagick 裁剪图像,或者如何计算合适的 d?

更新

我发现 Fred 的 ImageMagick 脚本 innercrop (http://www.fmwconcepts.com/imagemagick/innercrop/index.php) 可以满足我的需要,但有缺点,对我来说没有解决方案。它假定任意外部区域,因此需要很长时间才能找到裁剪矩形。它在 Unix 管道中不起作用,并且不保持原始纵横比。

更新 2

考虑这个问题让我认为计算“d”不是解决方案,因为更改 d 会引入或多或少的弯曲,并且似乎不仅仅是缩放。由 imagemagick 计算的 d=1-(a+b+c) 导致弯曲图像接触上/下界(对于横向图像)或左/右边界(对于纵向图像)。所以我认为正确的解决方案是计算新的 4 个角之一将被赋予 a/b/c/d 的位置,然后裁剪到这些新角。

【问题讨论】:

  • 由于我昨晚的第一条评论似乎消失了,让我重复一遍:您能否提供您要处理的示例图像,以及a、@987654328 的值@ 和 c 对您的相机/镜头/变焦组合有效?
  • 我当然可以,但我不明白这对这个问题有何影响。 rose: 与任何图片一样好,并且完美地显示了问题,您的跳棋也是如此 - 动机发生的事情不是这里的问题。在我找到上传位置之前,您可以在玫瑰上使用 3 种扭曲“0.1 0 0”、“0 0.1 0”和“0 0 0.1”。现在您已经模拟了不同的(简化的)扭曲并具有不同的弯曲黑色边框。问题是,在每种情况下,黑色区域“缩小”的原因是什么。

标签: command-line imagemagick crop photos distortion


【解决方案1】:

理解文档的方式,您不要使用逗号分隔桶形扭曲运算符的参数。

这是一个示例图像,以及您给出的两个命令的输出:

convert o.png -virtual-pixel black -distort Barrel '+0.0 +0.1 +0.0' out0.png
convert o.png -virtual-pixel black -distort Barrel '+0.0 +0.1 +0.0 +0.6' out1.png

  

我创建示例图像是为了更好地可视化您可能想要实现的目标。

但是,我没有看到你所说的关于自动计算参数'd'的观点,我没有看到你所说的使用'd=+0.6'的效果...

我不确定我是否正确理解了您想要的结果,所以我假设您希望裁剪黄色矩形标记的区域。

左边的图像是上面第一个命令创建的out0.png。 为了猜测所需的坐标,我们必须先确定图像尺寸:

identify out0.png
 out0.png PNG 700x700 700x700+0+0 8-bit sRGB 36KB 0.000u 0:00.000

中间的图像用白色矩形标记。矩形在那里,因此您可以查看它并告诉我这是否是您要裁剪的区域。右侧的图像是裁剪后的图像(未将其缩放回原始大小)。

  

这是你想要的吗?如果是,我可能会更新答案,以便自动确定所需的裁剪坐标。 (目前我是根据猜测完成的。)


更新

我认为您可能误解了桶形失真操作的目的。它用于校正桶形(轻微)失真,就像相机镜头产生的那样。用于相机、镜头和当前变焦的任何特定组合的 3 个参数 abc 可能会在照片的 EXIF 数据中说明。 a+b+c+d = 1 的公式适用于新的失真校正图像应与原始(失真)图像具有相同尺寸的情况。

所以为了模仿桶形校正,我们可能应该使用上面最后一行的第二张图像作为我们的输入:

convert out3.png -virtual-pixel gray -distort barrel '0 -0.2 0' corrected.png

结果:

【讨论】:

  • 感谢您的努力。是的,我确实使用它来校正照片中的镜头失真。对于给定焦距,我的镜头数据库中确实有适当的 a、b 和 c 值,但我没有 d。是否使用逗号似乎没有什么区别,但让我们切换到官方的非逗号格式。就像在您的第二个示例中一样,我想摆脱外部黑色区域,同时保持尽可能多的红色。过去,我使用来自 hugin 包的fulla 来校正图像,它会自行计算 d 和/或设法自动裁剪图像。
  • 并且:在我的测试中,使用-distort barrel 总是创建与原始相同的宽度/高度。负/正 d 会导致最终结果的线性放大/缩小,如果使用正确的值,则将弯曲的边框推到裁剪区域之外。并且图像通常是 3:2/2:3 的纵横比,而不是 1:1。最后,我不关心结果是通过裁剪还是放大得到的,只要保持原始的纵横比即可。
  • 关于 d=-0.6:此值仅适用于玫瑰,因为它取决于纵横比。这也只是一个猜测,使用 -0.599 或 0.601 或 ... 可能更准确
猜你喜欢
  • 2016-07-26
  • 2013-08-06
  • 2012-05-16
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 2012-07-31
  • 2018-07-15
相关资源
最近更新 更多