Command line 如何使用ImageMagick自动裁剪桶变形图像?

Command line 如何使用ImageMagick自动裁剪桶变形图像?,command-line,imagemagick,crop,photos,distortion,Command Line,Imagemagick,Crop,Photos,Distortion,使用ImageMagick的convertto barrel deformation a photo纠正强烈可见的枕状失真,我提供了正a、b或c值(来自镜头+焦距的数据库)。这将导致图像被校正,具有原始宽度和高度,但包括非矩形、弯曲/扭曲的边界,因为图像朝其中心校正。简化示例: convert rose: -virtual-pixel black -distort Barrel '+0.0 +0.1 +0.0' out.png 如何自动将黑色、弯曲的边框裁剪为玫瑰内部原始纵横比中可能最大的矩形

使用ImageMagick的
convert
to barrel deformation a photo纠正强烈可见的枕状失真,我提供了正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
(),它做了我需要的一些事情,但有缺点,对我来说不是解决方案。它测量任意外部区域,因此需要很长时间才能找到裁剪矩形。它不能在Unix管道中工作,并且不能保持原始的纵横比

更新2

思考这个问题使我认为计算“d”不是解决办法,因为改变d或多或少会带来弯曲,而且似乎不仅仅是缩放。由imagemagick计算的d=1-(a+b+c)会导致弯曲图像接触上/下限(对于横向图像)或左/右边界(对于纵向图像)。因此,我认为正确的解决方案是计算新的4个角点中的一个角点将被赋予a/b/c/d,然后裁剪到这些新角点。

按照我理解文档的方式,您不需要使用逗号来分隔桶扭曲操作符的参数

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

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个参数
a
b
c
可能会在照片的EXIF数据中说明。公式WARE
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并/或自动裁剪图像。而且:在我的测试中,使用
-扭曲桶
总是创建与原始图像相同的宽度/高度。负/正d将导致最终结果的线性放大/缩小,如果使用正确的值,则将弯曲的边界推到裁剪区域的正外部。图像的纵横比通常是3:2/2:3,而不是1:1。最后,我不在乎结果是通过裁剪还是放大获得的,只要原始纵横比保持不变。关于d=-0.6:该值仅适用于玫瑰,因为它取决于纵横比。此外,这只是一个猜测,可能更准确的是-0.599或0.601,或者……因为我昨晚的第一条评论似乎已经消失,让我重复一遍:您能提供一个您想要处理的示例图像,以及
a
的值吗,
b
c
哪两种对您的相机/镜头/变焦组合有效?我当然可以,但我不明白这会给这个问题增加什么。
rose:
和任何图片一样好,完美地显示了问题,就像你的跳棋一样-motiv发生了什么不是这里的问题。在我找到上传位置之前,您可以使用rose上的3种失真“0.1 0 0”、“0.1 0”和“0 0.1”。现在,您已经模拟了不同的(简化的)失真,并有了差异