【问题标题】:Understanding Perspective Projection Distortion ImageMagick了解透视投影失真 ImageMagick
【发布时间】:2012-08-29 20:35:08
【问题描述】:

对于一个项目,我正在尝试创建图像的透视变形以匹配 DVD 盒正面模板。所以我想使用 ImageMagick (CLI) 自动执行此操作,但我很难理解这种转换的数学方面。

convert \
  -verbose mw2.png \
  -alpha set \
  -virtual-pixel transparent \
  -distort Perspective-Projection '0,0 0,0   0,0 0,0' \
   box.png

这段代码是一个空的坐标集,我已经彻底阅读了文档,但我似乎无法理解什么参数代表什么点。文档给了我变量和名称,我不知道它们的实际含义(也许对数学策划者更有用)。因此,如果有人可以就这个主题向我解释(视觉上更喜欢,或者给我一个有用信息的链接),因为我不知道我在做什么。只是玩弄这些参数对这项工作是行不通的,我需要计算这些点。

在这里,您将找到我正在尝试实现的目标的简单图像(使用 CLI 工具):

更新:

   convert \
        -virtual-pixel transparent \
        -size 159x92 \
        -verbose \
        cd_empty.png \
        \(mw2.png -distort Perspective '7,40 4,30   4,124 4,123   85,122 100,123   85,2 100,30'\) \
         -geometry +3+20 \
        -composite cover-after.png

给我作为输出:

cd_empty.png PNG 92x159 92x159+0+0 8-bit sRGB 16.1KB 0.000u 0:00.000
convert: unable to open image `(mw2.png': No such file or directory @ error/blob.c/OpenBlob/2641.
convert: unable to open file `(mw2.png' @ error/png.c/ReadPNGImage/3741.
convert: invalid argument for option Perspective : 'require at least 4 CPs' @ error/distort.c/GenerateCoefficients/807.
convert: no images defined `cover-after.png' @ error/convert.c/ConvertImageCommand/3044.

Kurt Pfeifle 更正:

该命令存在语法错误,因为它没有按照 ImageMagick 的要求在每一侧将 \(\) 分隔符(至少一个)空白包围!

由于没有提供指向源图像的链接,我无法测试此更正命令的结果:

   convert                         \
        -virtual-pixel transparent \
        -size 159x92               \
        -verbose                   \
         cd_empty.png              \
           \(                      \
           mw2.png -distort Perspective '7,40 4,30  4,124 4,123  85,122 100,123  85,2  100,30' \
           \)                      \
        -geometry +3+20            \
        -composite                 \
         cover-after.png

【问题讨论】:

  • 我说得更远了,我现在使用点透视扭曲,这更容易理解。但是它给了我语法错误。但对我来说,我似乎完全遵循文档规则。我已将我的代码附加到上面的示例中。
  • 请提供(链接)您的一个示例输入图像,今晚晚些时候我会更仔细地查看它...
  • 啊...我可以立即看到 one 语法错误:\(\) 分隔符 *需要 被包围每个空白!我会相应地更新您的问题。
  • Windows 中的语法一样吗?

标签: imagemagick command-line-interface perspective


【解决方案1】:

你看到this very detailed explanation ImageMagick 的失真算法了吗?它还附带了很多插图。

通过查看您的示例图片,我猜您将使用Four Point Distortion Method 到达那里。

当然,您给出的带有0,0 0,0 0,0 0,0 参数的示例并没有达到您想要的效果。

ImageMagick 中可用的许多失真方法都是这样工作的:

  • 该方法使用一组控制点对
  • 值是数字(可以是浮点数,而不仅仅是整数)。
  • 每对控制点代表一个像素坐标。
  • 每组四个值代表一个源图像坐标,紧随其后的是目标图像坐标。
  • 将每个源图像控制点的坐标完全按照相应参数给定的方式传输到相应的目标图像控制点。
  • 根据给定的失真方法传输所有其他像素的坐标。

示例:

Sx1,Sy1 Dx1,Dy1 Sx2,Sy2 Dx2,Dy2 Sx3,Sy3 Dx3,Dy3 ... Sxn,Syn Dxn,Dyn

x 用于表示 X 坐标。
y 用于表示 Y 坐标。
@987654330 @, 2, 3, ... n 用于表示第 1、2、3、... n 个像素。
S 此处用于源像素.
D 在这里用于目标像素。

第一:方法-distort perspective

失真方法perspective 将确保源图像中的直线将在目标图像中保持直线。其他方法,例如 barrelbilinearforward 则不会:它们会将直线扭曲为曲线。

-distort perspective 需要一组至少 4 个预先计算的像素坐标对(其中最后一个可能为零)。超过 4 对像素坐标提供更准确的失真。因此,如果您使用例如:

-distort perspective '1,2  3,4     5,6  7,8     9,10  11,12     13,14  15,16'

(出于可读性原因,在映射对之间使用比要求更多的 {optional} 空格)意味着:

  1. 从源图像中获取坐标 (1,2) 处的像素,然后在目标图像中的坐标 (3,4) 处绘制它。
  2. 从源图像中获取坐标 (5,6) 处的像素,然后在目标图像中的坐标 (7,8) 处绘制它。
  3. 从源图像中获取坐标 (9,10) 处的像素,然后在目标图像中的坐标 (11,12) 处绘制它。
  4. 从源图像中获取坐标 (13,14) 处的像素,然后在目标图像中的坐标 (15,16) 处进行绘制。

您可能看到照片图像中的垂直线(如建筑物墙壁的角落)看起来根本不垂直(由于拍摄快照时相机倾斜)。方法-distort perspective可以解决这个问题。

它甚至可以实现诸如“拉直”或“矫正”以原始照片的“正确”视角出现的建筑物的一面:

 ==> 

用于这种失真的控制点由绘制在原始图像上的红色(source 控件)和蓝色矩形(destination 控件)的角表示:

 ==> 

使用了这种特殊的失真

-distort perspective '7,40 4,30   4,124 4,123   85,122 100,123   85,2 100,30'

完整的命令让您享受复制粘贴的乐趣:

convert                                                                      \
  -verbose                                                                   \
   http://i.stack.imgur.com/SN7sm.jpg                                        \
  -matte                                                                     \
  -virtual-pixel transparent                                                 \
  -distort perspective '7,40 4,30  4,124 4,123  85,122 100,123  85,2 100,30' \
   output.png

第二种:方法-distort perspective-projection

-distort perspective-projection 方法派生自更容易理解的perspective 方法。它实现了与-distort perspective 完全相同的失真结果,但不使用(至少)4 对坐标值(至少16 个整数)作为参数,而是使用8 个浮点系数。

它使用...

  1. 一组 正好 8 个预先计算的系数;
  2. 这些系数中的每一个都是一个浮点值(与-distort perspective不同,其中的值只允许整数);
  3. 这8个值代表一个矩阵形式

     sx   ry   tx
     rx   sy   ty
     px   py

    用于根据这个公式从源像素中计算出目标像素:

    X-of-destination = (sx*xs + ry+ys +tx) / (px*xs + py*ys +1)
    Y-of-destination = (rx*xs + sy+ys +ty) / (px*xs + py*ys +1)
    
    (TO BE DONE -- 
        I've no time right now to find out how to
        properly format + put formulas into the SO editor)
    

为了避免(更困难的)计算可重复使用的 8 个所需系数 -distort perspective-projection 方法,您可以...

  • 首先,(更容易)计算坐标 -distort perspective
  • 第二个,运行这个 -distort perspective 添加一个 -verbose 参数,
  • 最后,从打印到 stderr .
  • 的输出中读取8个系数

(上面引用的)完整命令示例会输出以下信息:

Perspective Projection:
  -distort PerspectiveProjection \
    '1.945622, 0.071451, -12.187838, 0.799032, 
     1.276214, -24.470275, 0.006258, 0.000715'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2018-05-03
    • 2013-11-26
    相关资源
    最近更新 更多