Unprojecting_text_with_ellipses过程分析
创始人
2024-04-29 00:35:35
0

文章目录

  • 一、单应性
    • 1. 图片实例
    • 2. 数学表达式
  • 二、算法思路
    • 1. 算法流程
    • 2. 透视失真具体解决方案
    • 3. 图片旋转具体解决方案
    • 4. 图片文字倾斜具体解决方案
  • 三、实际处理过程
  • 四、算法问题
  • 五、OCR识别

原文链接 https://mzucker.github.io/2016/10/11/unprojecting-text-with-ellipses.html

一、单应性

1. 图片实例

将普通 2D 文本图片转换成类似 3D 文本图片的映射过程叫做单应性。

借用原文中星球大战的图片, 这就是转换之后的图片.

2. 数学表达式

对每个像素点而言, 在 2D 到 3D 转换过程中满足下列式子

x′=ax+by+cgx+hy+1,y′=dx+ey+fgx+hy+1x' = \frac{ax+by+c}{gx+hy+1}, y'=\frac{dx+ey+f}{gx+hy+1} x′=gx+hy+1ax+by+c​,y′=gx+hy+1dx+ey+f​

x,yx,yx,y 表示转换前的像素坐标

x′,y′x',y'x′,y′ 表示转换后的像素坐标

有未知参数 a,b,c,d,e,f,g,ha,b,c,d,e,f,g,ha,b,c,d,e,f,g,h

这些参数控制着图片是如何转换的, 其中就有

aaa 控制图片左右拉伸, eee 控制图片上下拉伸

b,db,db,d 控制图片左右倾斜, 类似于矩阵变为平行四边形的过程

ccc 控制图片左右移动, fff 控制图片上下移动

ggg 控制图片左右透视失真, hhh 控制图片透视失真

上面列出的星球大战字幕图片就是由单由参数 hhh 控制转换所得

二、算法思路

1. 算法流程

我们可以找到一个完美的算法求出式子中的所有参数, 然后就能将图片还原,但是这是理想状态. 所以原文提出了一个很棒的思路.

我们现在拍摄了一张照片, 然后对它进行三步骤的处理.

步骤一 : 解决透视失真的问题

步骤二 : 解决图片旋转的问题

步骤三 : 解决图片中文字倾斜的问题

2. 透视失真具体解决方案

首先通过 opencv 获取到图片中字符的轮廓 (这一步可能会有其他干扰).

作者提出了一个观点, 当处理后的图片中每一个字符各占面积几乎相等时就认为解决了透视失真这个问题. 转换成数学表达式则是

通过找到 g,hg,hg,h 两个参数, 使得

Stotal=∑i=1n(Ai−Aˉ)2S_{total} = \sum_{i=1}^{n}(A_i - \bar{A})^2 Stotal​=i=1∑n​(Ai​−Aˉ)2

最小, 其中 StotalS_{total}Stotal​ 表示面积差总平方和, AiA_iAi​ 表示第 iii 个字符的面积, Aˉ\bar{A}Aˉ 表示字符平均面积.

!!! 这里更准确一点应该被称为轮廓面积, 而不是字符面积, 因为通过 opencv 会检测到其他干扰项. 我们假设最佳情况就是只检测到字符. 以下步骤都是居于此来完成.

椭圆方程

f(x,y)=Ax2+Bxy+Cy2+Dx+Ey+F=0f(x,y) = Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0 f(x,y)=Ax2+Bxy+Cy2+Dx+Ey+F=0

通过一定手段使得列入计算的字符转换成相同面积的椭圆, 用椭圆方程中的A,B,C,D,E,FA,B,C,D,E,FA,B,C,D,E,F六个参数来描述该字符. 由此构建出一个矩阵用于解决透视失真问题.

3. 图片旋转具体解决方案

霍夫变换

4. 图片文字倾斜具体解决方案

用凸包表示一个字符, 构建一个矩阵使得图片中字符宽度最小化. 构建出的矩阵中的参数就是单应性所提到的参数 b,db,db,d

三、实际处理过程

输入图片

获取字符轮廓和面积

字符轮廓进行椭圆化处理, 解决透视失真

霍夫变换, 解决图片旋转问题

凸包代理, 解决文字倾斜问题

处理结果

四、算法问题

当使用如下图片进行处理时

在处理这个图片时就会误把边框进行处理, 且不能检测到所有字符.

五、OCR识别

未处理的图片识别

处理后的图片识别

未处理的图片识别

处理后的图片识别

未处理的图片识别 (不能识别)

处理后的图片识别

未处理的图片识别

处理后的图片识别

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...