页面图片如何被整理成看起来好像被扫描了?

时间:2017-02-09 18:12:17

标签: javascript image-processing transformation conceptual

我见过应用程序,并想知道如何以编程方式拍摄图像。定义它需要如何变换,使其看起来与相机平行,而不是倾斜透视。

然后组合多张照片以创建pdf文件。例如,这个应用程序执行:https://play.google.com/store/apps/details?id=com.appxy.tinyscan&hl=en

1 个答案:

答案 0 :(得分:3)

我不会因为这些琐碎的事情而使用书籍而对不起我不推荐任何书籍(特别是英文版)。你需要做的是:

control points

  1. 输入图片
  2. 查找主要轮廓

    理想情况下整个网格,但即使外部轮廓也足够(如果不存在网格)。您需要将轮廓分为水平(红色)和垂直(绿色)曲线(或一组点)。

  3. 样本等高线曲线4"等距离"点

    由于图像失真(不仅仅是旋转),我们需要至少使用双三次插值。为此,我们需要每个补丁16点(Aqua)。

  4. 添加镜像点以覆盖整个网格

    图像上的

    是镜像(黄色)点,仅适用于水平轮廓,你也应该对垂直轮廓进行此操作(不适合我在图像中,并且不想为此扩大分辨率)以及角点也是如此你有6x6个控制点。镜子可以线性完成(就像我一样)。

  5. 现在转换完成如下:

    1. 处理目标图片的所有像素dst(x0,y0)
    2. 处理x,y作为三次插值的参数

      如果xs,ys是目标图片解析,那么:

      u=(3.0*x)/xs
      v=(3.0*y)/ys
      

      现在,通常在参数t=<0.0,1.0)上进行三次插值
      如果u=<0.0,1.0>使用t=u和控制点0,1,2,3
      如果u=<1.0,2.0)使用t=u-1.0和控制点1,2,3,4
      如果u=<2.0,3.0>使用t=u-2.0和控制点2,3,4,5

      垂直轮廓和v也是如此。将xi,yi计算为(u,v)的双三次插值。并复制像素:

      dst(x,y)=src(xi,yi);
      

      这只是最近邻居,但你也可以使用双线性...作为立方曲线,我会使用这个polynomial

      双三次插值背后的想法很简单。在4个水平轮廓上对应于参数u的计算点。这将为垂直方向的最终三次插值和v作为参数提供4个控制点。结果坐标是您的源像素位置。

    3. 有关详细信息,请参阅:

      如果您没有网格,请使用可以作为一个网格使用的任何信息。例如,文本行可以被认为是这个的轮廓...