我有一个图像,上面有自由曲线(实际上是小线段的列表),我希望生成某种图像扭曲,使图像变形,使这些曲线变为变形为水平直线。
我已经将所有线段点的坐标分开存储,因此不必从图像中提取它们。我正在寻找的是一种扭曲图像的合适方法,使这些线条变成直线。
感谢
答案 0 :(得分:1)
您可以使用与此处开发的方法类似的方法: http://www-ui.is.s.u-tokyo.ac.jp/~takeo/research/rigid/
您要做的是定义一个覆盖源图像的MxN控制点网格。 然后,您需要确定如何修改每个控制点,以便最终图像将最小化一些能量函数(最小曲率或类似的东西)。
最终图像是由控制点确定的线性扭曲(将其视为2D网格,其纹理是源图像,其顶点位置即将修改)。
只要您的能量函数可以使用线性方程表达,您就可以使用线性方程求解器全局解决您的问题(找出每个控制点的发送位置)。
使用周围网格点的双线性插值权重表示每个源点(位于曲线上的点),然后通过编写这些点的方程来表达对目标的限制。
在求解这些线性方程后,您最终会得到目标网格点,然后您只需使用新顶点的位置渲染2D网格。
答案 1 :(得分:0)
您需要从一个映射公式开始,给定输出坐标将提供输入图像的相应坐标。根据你想要纠正的失真,这可能变得非常复杂;您的问题没有详细说明问题。例如,图像顶部的曲线是否与底部的曲线相同,与中间的曲线相同?水平距离是否根据线的角度进行压缩?让我们假设最简单的情况是水平坐标根本不需要任何校正,而垂直只需要基于水平的恒定校正。此处x,y
是输入图像上的坐标,x',y'
是输出图像上的坐标,f()
是绘制的线段与理想直线之间的差异。
x = x'
y = y' + f(x')
现在,您只需浏览输出图像的所有像素,计算输入图像中的对应点,然后复制像素。这里的皱纹是你的公式可能会给你位于输入像素之间的点,例如y=4.37
。在这种情况下,您需要进行插值以从输入中获取中间值;图像有很多插值方法,我不会尝试进入这里。最简单的是“最近邻居”,您只需将坐标舍入到最接近的整数。