如何使用ImageMagick自动裁剪桶形失真图像?

时间:2014-12-29 10:35:19

标签: command-line imagemagick crop photos distortion

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

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

如何自动将黑色弯曲边框裁剪为玫瑰中原始宽高比的最大矩形?

enter image description here

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似乎取决于图像的纵横比,而不仅仅取决于a / b / c。如何使ImageMagick裁剪图像,或者如何计算合适的d?

更新

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

更新2

考虑这个问题让我觉得计算一个" d"不是解决方案,因为改变d会引入或多或少的弯曲,并且似乎不仅仅是缩放。通过imagemagick计算的d = 1-(a + b + c)导致弯曲图像接触上/下边界(对于风景图像)或左/右边界(对于肖像图像)。因此我认为正确的解决方案是计算新的4个角中的哪一个将被赋予a / b / c / d,然后裁剪到那些新的角落。

1 个答案:

答案 0 :(得分:0)

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

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

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'的效果< / EM> ...

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

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

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

中心的图像标有白色矩形。矩形在那里,所以你可以看看它,并告诉我这是否是你想要裁剪的区域。右侧的图像是裁剪后的图像(不会将其缩放回原始大小)。

这是你想要的吗? 如果是,我可以更新答案,以便自动确定裁剪所需的坐标。 (现在我已经基于猜测完成了。)


更新

我认为你可能误解了桶形失真操作的目的。它适用于 校正 桶状(轻微)失真,这是由相机镜头产生的。可以在照片的EXIF数据中说明用于相机,镜头和当前缩放的任何特定组合的3个参数abc。当新的失真校正图像应与原始(失真)图像具有相同的尺寸时,使用公式a+b+c+d = 1

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

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

结果: