【问题标题】:How can picture of page be straightened out to look as if it was scanned?怎样才能把页面的图片弄直,看起来就像是扫描过的一样?
【发布时间】:2017-02-09 18:12:16
【问题描述】:

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

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

【问题讨论】:

标签: javascript image-processing transformation conceptual


【解决方案1】:

我不会将书籍用于此类琐碎的事情,所以很抱歉我不能推荐任何书籍(尤其是英文版)。你需要做的是:

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

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

  3. 通过 4 个“等距”点对轮廓曲线进行采样

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

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

    图像上的镜像(黄色)点仅适用于水平轮廓,您也应该对垂直轮廓执行此操作(图像中不适合我,并且不想为此放大分辨率)以及角点,所以你有6x6 控制点。镜子可以线性完成(就像我做的那样)。

现在转换是这样完成的:

  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 对应的点。这将为您在垂直方向上的最终三次插值提供 4 个控制点,并将 v 作为参数。结果坐标是您的源像素位置。

更多信息见:

如果您没有网格,请使用任何可以用作网格的信息。例如,可以将文本行视为此轮廓的轮廓...

【讨论】:

  • 我会在 2 天内回复任何问题,这对我来说是很多东西,所以请耐心等待。
  • 我以前问过这个问题,没人能回答。这不是微不足道的,我会参加 6 个月的课程,然后感觉很舒服。
  • 我是一名网络开发人员,如果你写过这方面的书,请购买。像这样将简单英语的新手程序员带到图像处理中的高级概念的东西。
  • @MuhammadUmer 这不是高级的东西,而是 CV/DIP 基础知识和低级图形原理的融合。问题是该领域的大多数程序员都专注于他们狭窄的领域,因此看不到与他人的联系……即使他们是基础知识。写这样的书需要 6 到 12 个月,我没有时间也没有心情做这样的事情,更不用说需要资金了。我前段时间停止发布。也应该有很多这样的书,有些甚至是在线的,所以只需谷歌搜索计算机视觉和计算机图形学。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多