对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的。

  针对上述情况,所以我们在处理有角度的图象时,需要将图像“摆正”,将使用到getPerspectiveTransform方法和warpPerspective方法。

getPerspectiveTransform:

参数:

  • src:源图像中的四个点坐标,以浮点数数组或列表的形式表示。这些点应按照逆时针方向指定。
  • dst:目标图像中对应的四个点坐标,以浮点数数组或列表的形式表示。这些点应按照逆时针方向指定。

返回值:

  • M:一个3x3的透视变换矩阵,以浮点数NumPy数组的形式返回。可以使用此变换矩阵将源图像中的点映射到目标图像中对应的点。

warpPerspective:

参数:

  • src:输入图像,可以是8位无符号整数类型、32位浮点类型或16位有符号整数类型。
  • M:3x3的变换矩阵,可以使用cv2.getPerspectiveTransform()函数计算得到。
  • dsize:输出图像的大小,以(width, height)的形式指定。可以通过cv2.resize()函数调整大小,也可以直接提供目标大小。
  • flags:插值方法的标志,可以是cv2.INTER_NEARESTcv2.INTER_LINEARcv2.INTER_CUBICcv2.INTER_LANCZOS4之一。
  • borderMode:用于处理超出边界的像素值的标志,可以是cv2.BORDER_CONSTANTcv2.BORDER_REPLICATEcv2.BORDER_REFLECTcv2.BORDER_WRAPcv2.BORDER_REFLECT_101之一。

返回值:

  • dst:输出图像,与dsize参数指定的大小相同。

Code:

 1 height, width = numpy.int0(cv2.minAreaRect(goal_points)[1])
2 hw_rate = height / width
3 new_width = 400
4 new_height = int(new_width * hw_rate)
5 pts = numpy.float32([[0, 0], [new_width, 0], [new_width, new_height], [0, new_height]])
6
7 ll = [i for item in iter(goal_points) for i in item]
8 if ll[0][0] > ll[1][0]:
9 ll[0], ll[1] = ll[1], ll[0]
10 ll[2], ll[3] = ll[3], ll[2]
11
12 matrix = cv2.getPerspectiveTransform(numpy.float32(ll), pts)
13 iout = cv2.warpPerspective(image, matrix, (new_width, new_height))

思路:

1、首先我们将approxPolyDP逼近轮廓(goal_points)所返回的四个坐标点传入minAreaRect来获得逼近轮廓的宽高。

2、然后我们求取宽高比,为后续新的图片大小做准备。

3、我们设置一个新的宽(new_width)的值,并根据上一步求得的宽高比得到新的高(new_height)的值。

4、以顺时针坐标顺序,定义新图片的四个坐标点(pts)。

5、将goal_points(此时是三维数组)拆分成二维。

6、通过上一篇博客我们知道了approxPolyDP返回的坐标点是逆时针的,且第一个坐标是变化的,所以我们通过比较第一个坐标的x和第二个坐标的x来确定谁在左上角,并且因为我们定义的新窗口的四个坐标是顺时针,所以需要将第三第四个坐标对调一下,从而符合顺时针的要求。

7、调用getPerspectiveTransform方法和warpPerspective方法,最终得到我们透视变换后的水平图片。

注:关于warpPerspective的dsize参数,我们可以随意定义宽高,比如上述代码中可以直接将(new_width, new_height)替换成(300, 300)对应的pts中的new_width, new_height也需要进行替换,但是我们得到的图片是正方形的,和原图中的感兴趣区域的长方形并不相符,所以最终得到的透视变换图也就不理想的。

【Python】【OpenCV】OCR识别(二)——透视变换的更多相关文章

  1. 使用Python进行OCR -- 识别图片中的文字

    工具 Tesseract pytesseract tesserocr 朋友需要一个工具,将图片中的文字提取出来.我帮他在网上找了一些OCR的应用,都不好用.所以准备自己研究,写一个Web APP供他使 ...

  2. Python OpenCV人脸识别案例

    ■环境 Python 3.6.0 Pycharm 2017.1.3 ■库.库的版本 OpenCV 3.4.1 (cp36) ■haarcascades下载 https://github.com/ope ...

  3. Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...

  4. Python 进行 OCR识别 -- pytesseract库

    pip install pytesseract 报错:tesseract is not installed or it's not in your path 下载安装 Tesseract-OCR ht ...

  5. python opencv 人脸识别

    def findface(image): import cv2  frame=cv2.imread('n1.jpg') classifier=cv2.CascadeClassifier("h ...

  6. Python+Opencv进行识别相似图片

    http://blog.csdn.net/feimengjuan/article/details/51279629

  7. 深入学习OpenCV文档扫描及OCR识别(文档扫描,图像矫正,透视变换,OCR识别)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  8. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

  9. Python+opencv打开修图的正确方式get

    先逼逼两句: 图像是 Web 应用中除文字外最普遍的媒体格式. 流行的 Web 静态图片有 JPEG.PNG.ICO.BMP 等.动态图片主要是 GIF 格式.为了节省图片传输流量,大型互联网公司还会 ...

  10. python3使用OCR识别图片

    放假三天,闲来无事,想学下python爬虫.本想跟着网上教程操作一遍,奈何安装使用过程中出现一堆问题,并且在网上搜了一堆复制黏贴的答案,关键都不能起作用,最后终于找到一篇生效,为了以后不至于再经历这种 ...

随机推荐

  1. 2006年piner的面试题

    数据库切换日志的时候,为什么一定要发生检查点?这个检查点有什么意义?表空间管理方式有哪几种,各有什么优劣.本地索引与全局索引的差别与适用情况.一个表a varchar2(1),b number(1), ...

  2. 一个树状数组求逆序对的进阶 [USACO17JAN] Promotion Counting P

    题面就这样,就是在树上求一个逆序对但是我笨笨地求了对于每一个下属有几个上司能力比他低还一遍就写对了,结果发现看错题目了难得一遍过,但是没有完全过

  3. 如何在虚拟机上安装linux操纵系统

    1.下载linux操作系统的镜像文件(iso文件),官网链接(CentOS Mirrors List) (3)下载大小为4G 或者4.几G的iso镜像文件 2.下载我发的VMware Workstat ...

  4. 银河麒麟V10 修改文件夹权限

    并不建议修改系统文件夹的权限,防止终端失效 指令:获取所有权限 指令:写入可执行权限 chmod +x filename//filename 是文件路径 TRANSLATE with x Englis ...

  5. Flyweight 享元模式简介与 C# 示例【结构型6】【设计模式来了_11】

    〇.简介 1.什么是享元模式? 一句话解释:   将相似或同类的对象共享同一个对象,将这些对象暂存在列表中,使用时直接取出,避免每次使用时都要新建浪费资源. 享元模式的目的是减少对象的创建,通过共享对 ...

  6. CSS属性 Position的几种定位方式

    作者:WangMin 格言:努力做好自己喜欢的每一件事 在讲几种定位方式之前,我们先来了解一下什么是普通流(normal flow)? 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由 ...

  7. 【scipy 基础】--插值

    插值运算是一种数据处理方法,主要用来填补数据之间的空白或缺失值.因为在实际应用中,数据往往不是完整的,而是存在着空白或缺失值,这些空白或缺失值可能是由于数据采集困难.数据丢失或数据处理错误等原因造成的 ...

  8. Java实现两字符串相似度算法

    1.编辑距离 编辑距离:是衡量两个字符串之间差异的度量,它表示将一个字符串转换为另一个字符串所需的最少编辑操作次数(插入.删除.替换). 2.相似度 计算方法可以有多种,其中一种常见的方法是将编辑距离 ...

  9. picgo+GitHub搭建图床

    picgo+GitHub 搭建图床 目录 picgo+GitHub 搭建图床 图床的概念 使用 GitHub 创建图床服务器 在 GitHub 上面新建仓库 生成 token 令牌 创建 img 分支 ...

  10. 聊聊Flink必知必会(五)

    聊聊Flink的必知必会(三) 聊聊Flink必知必会(四) 从源码中,根据关键的代码,梳理一下Flink中的时间与窗口实现逻辑. WindowedStream 对数据流执行keyBy()操作后,再调 ...