Unprojecting_text_with_ellipses过程分析

news2025/7/15 0:51:07

文章目录

  • 一、单应性
    • 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 ′ = a x + b y + c g x + h y + 1 , y ′ = d x + e y + f g x + h y + 1 x' = \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 , y x,y x,y 表示转换前的像素坐标

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

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

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

a a a 控制图片左右拉伸, e e e 控制图片上下拉伸

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

c c c 控制图片左右移动, f f f 控制图片上下移动

g g g 控制图片左右透视失真, h h h 控制图片透视失真

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

二、算法思路

1. 算法流程

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

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

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

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

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

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

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

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

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

S t o t a l = ∑ i = 1 n ( A i − A ˉ ) 2 S_{total} = \sum_{i=1}^{n}(A_i - \bar{A})^2 Stotal=i=1n(AiAˉ)2

最小, 其中 S t o t a l S_{total} Stotal 表示面积差总平方和, A i A_i Ai 表示第 i i i 个字符的面积, A ˉ \bar{A} Aˉ 表示字符平均面积.

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

椭圆方程

f ( x , y ) = A x 2 + B x y + C y 2 + D x + E y + F = 0 f(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 , F A,B,C,D,E,F A,B,C,D,E,F六个参数来描述该字符. 由此构建出一个矩阵用于解决透视失真问题.

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

霍夫变换

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

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

三、实际处理过程

输入图片

获取字符轮廓和面积

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

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

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

处理结果

四、算法问题

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

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

五、OCR识别

未处理的图片识别

处理后的图片识别

未处理的图片识别

处理后的图片识别

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

处理后的图片识别

未处理的图片识别

处理后的图片识别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ListView的基本创建方式

ListView的基本创建方式 1.ListView 主要介绍了采用标签创建以及ArrayAdapter适配器以及采用继承ListActivity的方式创建列表项 1.简介 是一个列表控件,以列表的形式展示具体内容,可以给各行设置事件监听器ListView中View负责显示和更新,数据…

最小生成树

文章目录基本原理Kruskal算法Prim算法基本原理 连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不在连通;反之,在其中引入任何一条新边,都会形成一条回路…

二叉树9:二叉树的最大深度

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接: 104. 二叉树的最大深度 559.n叉树的最大深度 104.二叉树的最大深度 题目: 给定一个二叉树&#xff0…

校招面试真题 | 你的期望薪资是多少?为什么

很多人去面试的时候,就像打游戏,过五关斩六将,终于到最后一关了,但是谈薪资的难度堪比打游戏中搞定终级 boss 的难度,真的是太「南」了,好多人都是因为这个问题让自己五味杂陈呀。报高了怕好 offer 失之交臂…

Ubuntu: Docker安装与操作

在进行docker安装前,我们首先得有以下工具:xshell,FileZilla Client Xshell下载安装教程 FileZilla Client下载安装教程 如果你的Ubuntu是纯净的(也就是说刚下好并且刚用虚拟机装好的),你得先 打开终端(CtrlAltT) 一…

远程连接服务器(运用密钥)连接winscp/vscode/mobaxterm

1.连接ssh 先检查自己是否登上校园VPN校园VPN导航页 (xjtu.edu.cn) sslvpn 进入cmd(黑框框) 输入: (1) ssh (用户名)(IP名) -p (端口如22、2022&#x…

基于SSM框架的旅游网站的设计与实现

1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,*基于SSM框架的旅游网站的设计与实现 *。 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 1.1.研究背景 随着互联网技术的飞速发展,网络与我们的生活息息相关,在我们日…

汉诺塔问题的时间复杂度

一、汉诺塔问题 汉诺塔(Tower of Hanoi)是一个经典的递归算法问题。它描述的是有三根杆子和若干个不同大小的圆盘,圆盘可以按照大小顺序放在杆子上。初始时,所有圆盘都放在左边的杆子上,目标是将所有圆盘移动到右边的…

PS CS6视频剪辑基本技巧(三)添加声音和字幕

上一讲,介绍一下视频剪接和添加图片这两个功能。这一讲介绍添加声音和字幕,给上一讲剪接的视频添加一个背景音乐和解说字幕。 目录 一、添加音频 1、添加背景音乐 2、剪掉多余音乐 二、添加字幕 1、制作字幕模板 (1)新建背…

统治扩散模型的U-Net要被取代了,谢赛宁等引入Transformer提出DiT

来自 UC 伯克利的 William Peebles 以及纽约大学的谢赛宁撰文揭秘扩散模型中架构选择的意义,并为未来的生成模型研究提供经验基线。 近几年,在 Transformer 的推动下,机器学习正在经历复兴。过去五年中,用于自然语言处理、计算机视…

【C++】STL——priority_queue的介绍和使用及模拟实现

priority_queue的介绍和使用及模拟实现 文章目录priority_queue的介绍和使用及模拟实现1.priority_queue的介绍和使用priority_queue的介绍priority_queue的使用2. 仿函数3.堆的调整算法堆的向上调整算法堆的向下调整算法4.priority_queue的模拟实现1.priority_queue的介绍和使…

史上最简单易懂的TypeScript教程(更新中)

TypeScript欢迎观看由大型东方幻想车编写的typescript教程1. TypeScript: 类型(1)其他类型欢迎观看由大型东方幻想车编写的typescript教程 TypeScript介绍: TypeScript是JavaScript类型的严格超集,它可以编译成纯JavaScript。TypeScript可以在…

基于VitePress搭建静态文档系统

文章目录前言一、快速上手二、常用配置2.1 类Vue风格首页2.2 顶部导航配置themeConfig.nav2.3 侧边栏导航设置2.3 文档中的链接跳转2.3.1 上一页与下一页2.3.2 文档中链接2.3.3 生成成员页三、进阶配置四、参考代码前言 vitePress:与vue press相似,是一…

Spring中自定义事件监听

目录 一、Spring中的事件监听 二、自定义事件监听 三、例子 1、事件 2、事件监听器 3、事件发布操作 三、测试注意 一、Spring中的事件监听 当处理完一段代码逻辑,后面需要同时执行多个任务,有什么好方法呢?如果在微服务项目中&…

【自用】VUE项目 宝塔部署 上线阿里云服务器CentOS7.6

一、给VUE项目打包 1.开始打包 运行命令: npm run build2.找到打包好的 dist 文件夹 要记住这个dist文件放在了哪儿,记住哦! 二、服务器端安装宝塔面板 1.进入root用户并执行命令 yum install -y wget && wget -O install.…

Node基础——认识Node

什么是Node 首先JavaScript是一门编程语言,就像Java、Python、C#、GO一样,在Node出来之前,JavaScript主要运行于浏览器中,用来控制页面的展示逻辑,以及交互操作等。JavaScript之所以能够在浏览器中执行,是…

Docker搭建Mysql主主架构

文章目录mysql主从架构原理MySQL通用架构方案搭建步骤1. docker创建俩台mysql 端口:23306 和 333062. 创建my.cnf,并将my.cnf拷贝到docker容器中,并重启生效3. 配置完成,开始执行sql,设置主从主主同步mysql主从架构原理…

CSDN每日一练非负整数求和 C语言

题目名称:非负整数求和 时间限制:1000ms 内存限制:256M 题目描述: 给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和。 注意: - num1 和 num2 的长度都小于 5100. - num1 和 num2 都只包含数字 0…

【圣诞节特辑】爱心代码(程序员的浪漫plus+)-李峋

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 唯有热爱,可抵岁月漫长,唯有热爱,不畏世间无常! 一、前言 前段时间《点燃我温暖你》中李峋的爱心代码超级火,看着特别心动!这不,圣…

贪心算法(Java版本)

一、贪心算法 1、算法描述 贪心算法(Greedy algorithm),又叫做贪婪算法。 在对问题求解时,不从整体考虑,而是从问题的某一个初始解出发,每一步选择中都采取在当前状态下最好或最优的选择(局部…