首页 文章

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

提问于
浏览 1330
3

使用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?

Update

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

Update 2

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

1 回答

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

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

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

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

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

    Is this what you want? 如果是,我可以更新答案,以便自动确定裁剪所需的坐标 . (现在我已经基于猜测完成了 . )


    更新

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

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

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

    结果:

相关问题