【问题标题】:Add convex effect to image programmatically以编程方式为图像添加凸面效果
【发布时间】:2012-01-12 14:12:36
【问题描述】:

我正在寻找一些算法来为图像添加凸面镜效果和凹面镜效果。我还想知道如何有效地做到这一点:将算法应用于图像数据或用包含效果的透明图像覆盖它。但我认为第二种选择不适用于这种情况。

【问题讨论】:

    标签: c algorithm image-processing effects


    【解决方案1】:

    如果您是手动执行而不是使用硬件原语,那么bresenham interpolation algorithm(通常用于画线)是可行的方法:错误传播比其他更复杂的方法更有效。

    Bresenham 所做的只是插值。不要错过在其他地方使用其高效设计的机会(线条绘制的斜率计算只是插值的众多应用之一:您可以插值另一个维度:2D、3D、透明度、反射、颜色等)。

    25 年前,我记得我曾用它来调整位图大小,甚至在实时 3D 引擎中进行纹理映射!那是在图形加速视频板花费一大笔钱的时候......

    【讨论】:

    • 您应该解释如何在请求的情况下应用这种算法。鉴于镜头图像变形通常是通过二维傅里叶变换获得的,使用已知的最简单算法之一获得如此复杂的效果将是惊人的。
    • 让我们考虑 1D(一条扫描线),因为 2D 问题通过 2 遍(一个水平,一个垂直)解决。因此,凹面效果将放大扫描线的中心段并拉伸边界段(您可以利用对称性仅计算一半的值)。这就是插值的作用。凸效果则相反。如果您对线性插值不满意,您可以在循环中添加一个因子。这将比傅里叶变换快得多。要获得 3D 效果,请使用第三遍。
    • "到目前为止?"我们正在讨论哪种方法可以解决问题,并在可能的情况下找到最有效的方法。 Bresenham 每次都会使用 Fourrier 变换。为了比 Bresenham 更相关,您必须提出一种更快的方法。
    • 我们将不胜感激进一步解释(作为您回答的一部分)。
    • 问题是“我正在寻找一些算法”,而不是“一些代码”。此外,我有一份全职工作。我使用 sin() 表在下面发布了一个新的解决方案。希望这将更明显如何使用它。
    【解决方案2】:

    CImg 库有一个鱼眼样本,在 examples\CImg_demo.cpp 中。核心算法看起来非常简单(而且速度很快,就像这个库一样)。我认为它是真实光学效果的近似值,但可以修改以处理凸面镜像。我不知道它是否可以扩展到处理“负”曲率。

    【讨论】:

      【解决方案3】:

      您可以使用pre-calculated sin() table 并插入值以匹配位图的大小。通过使用偏移量或更大的表来实现相反的效果。

      让我想起了 80 年代 DOS 演示的(伟大时期)...

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多