使用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似乎取决于图像的纵横比,而不仅仅取决于a / b / c。如何使ImageMagick裁剪图像,或者如何计算合适的d?
更新
我发现弗雷德的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,然后裁剪到那些新的角落。
答案 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个参数a
,b
和c
。当新的失真校正图像应与原始(失真)图像具有相同的尺寸时,使用公式a+b+c+d = 1
。
因此,为了模仿桶校正,我们应该使用上面最后一行的第二张图像作为输入:
convert out3.png -virtual-pixel gray -distort barrel '0 -0.2 0' corrected.png
结果: