在我们的日常生活中,所碰到的图像往往都有一定的倾斜。那么,如何用OpenCV来获取图像的旋转角度呢?

  我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度。

  可以看到,该图像存在着许多噪声,且是彩色图片,因此,需要对图像做预处理。

预处理

  图像的预处理包括去除边缘,去除噪声(两条灰色线),滤波,二值化等,具体处理的Python代码如下:

  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. imagepath = 'F://CHN_Char/4.png'
  4. img = cv2.imread(imagepath, 1)
  5. # 将图片的边缘变为白色
  6. height, width = img.shape[0:2]
  7. for i in range(width):
  8. img[0, i] = [255]*3
  9. img[height-1, i] = [255]*3
  10. for j in range(height):
  11. img[j, 0] = [255]*3
  12. img[j, width-1] = [255]*3
  13. # 去掉灰色线(即噪声)
  14. for i in range(height):
  15. for j in range(width):
  16. if list(img[i,j]) == [204,213,204]:
  17. img[i,j]=[255]*3
  18. # 把图片转换为灰度模式
  19. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  20. # 中值滤波
  21. blur = cv2.medianBlur(gray, 3) # 模板大小3*3
  22. # 二值化
  23. ret,thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
  24. # 保存图片
  25. cv2.imwrite('F://CHN_Char/char_after_bin.png', thresh)

预处理后的图片如下:

  可以看到,预处理后的图像基本不含噪声,且是黑色图片,这样,我们就可以进行后续操作了。

获取旋转角度

  对于上述预处理后的图片,可以用OpenCV的最小外接矩形方法(minAreaRect())来操作,该方法会返回最小外界矩形的中心点左边,矩形宽度、高度,以及旋转角度。因为图像中只有一个文字,因此包含该文字的最小外接矩形返回的角度就是图像的旋转角度(当然也有可能是负值)。

  完整的Python代码如下:

  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. import numpy as np
  4. imagepath = 'F://CHN_Char/char_after_bin.png'
  5. img = cv2.imread(imagepath, -1)
  6. image, contours, _ = cv2.findContours(img, 2, 2)
  7. for cnt in contours:
  8. # 最小外界矩形的宽度和高度
  9. width, height = cv2.minAreaRect(cnt)[1]
  10. if width* height > 100:
  11. # 最小的外接矩形
  12. rect = cv2.minAreaRect(cnt)
  13. box = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点
  14. box = np.int0(box)
  15. if 0 not in box.ravel():
  16. '''绘制最小外界矩形
  17. for i in range(4):
  18. cv2.line(image, tuple(box[i]), tuple(box[(i+1)%4]), 0) # 5
  19. '''
  20. # 旋转角度
  21. theta = cv2.minAreaRect(cnt)[2]
  22. if abs(theta) <= 45:
  23. print('图片的旋转角度为%s.'%theta)
  24. angle = theta
  25. # 仿射变换,对图片旋转angle角度
  26. h, w = img.shape
  27. center = (w//2, h//2)
  28. M = cv2.getRotationMatrix2D(center, angle, 1.0)
  29. rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
  30. # 保存旋转后的图片
  31. cv2.imwrite('F://CHN_Char/after_rotated.png', rotated)

输出结果如下:

  1. 图片的旋转角度为-23.629377365112305.

得到的图像如下:

  在上述Python代码中,先是利用minAreaRect()获取图像中的最小外接矩形,加上一定的筛选条件(如矩形的面积大于100,旋转角度小于45度等)就能得到包含文字的最小外界矩形,其旋转角度就是整个图像的旋转角度。

识别图像中的文字

  有了旋转后的图像,我们不妨利用Tesseract-OCR软件来识别图像中的文字,完整的Python代码如下:

  1. import pytesseract
  2. import cv2
  3. # tesseract.exe所在的文件路径
  4. pytesseract.pytesseract.tesseract_cmd = 'C://Program Files (x86)/Tesseract-OCR/tesseract.exe'
  5. imagepath = 'F://CHN_Char/after_rotated.png'
  6. image = cv2.imread(imagepath, -1)
  7. text = pytesseract.image_to_string(image, lang='chi_sim', config='-psm 10')
  8. print("Tesseract-OCR的识别结果为: '%s'."%text)

输出结果为:

  1. Tesseract-OCR的识别结果为: '知'.

因此,我们得到的图像的旋转角度是正确的。当然,借用以上方法,还可以识别以下图片中的文字:

总结

  本次获取图像的旋转角度是利用了图像中只有一个文字,而包含该文字的最小外接矩形的旋转角度就是图像的旋转角度。这只是获取图像旋转角度的一种方式,当然,还会有其他获取图像旋转角度的方法,后续还会继续介绍,欢迎大家交流~~

注意:本人现已开通微信公众号: 轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

OpenCV入门之获取图像的旋转角度的更多相关文章

  1. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  2. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置

    图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...

  3. 【OpenCV入门指南】第一篇 安装OpenCV

    http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...

  4. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  5. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  6. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  7. OpenCV入门教程

    OpenCV入门教程 作者:于仕琪 OpenCV入门教程.pdf

  8. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  9. OpenCV入门之获取验证码的单个字符(二)

      在文章 OpenCV入门之获取验证码的单个字符(字符切割)中,介绍了一类验证码的处理方法,该验证码如下: 该验证码的特点是字母之间的间隔较大,很容易就能提取出其中的单个字符.接下来,笔者将会介绍如 ...

随机推荐

  1. Node selenium-webdriver

    Selenium-webdriver基本使用 准备 ① node.js 的安装和配置略 ② Selenium-webdriver npm install -save selenium-webdrive ...

  2. OC基础成员变量、属性变量、实例方法与类方法

    首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...

  3. JavaScript复习笔记——数据类型

    1.undefined 使用var声明但未对其进行初始化时,这个变量的值就是undefined. 对未被初始化的值使用typeof会返回undefined值,而对未声明的变量执行typeof操作同样也 ...

  4. G++与C++的区别

    C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 不同的编译器,会对代码做出一些不同的优化 比如说: a++;  和 ++a; 如果从标准C的角度去理解.a++这个 ...

  5. react native (1) 新建页面并跳转

    新建页面 1.新建文件 import React from 'react'; import { Text } from 'react-native'; export default class tod ...

  6. css伪元素 ::after ::before

    我遇到的问题: div盒子标签设置了伪元素 ::after  ::before  并给这俩content内容设置了空属性,添加了背景图,发现这两个伪元素没有宽度和高度. 解决方法 给设置伪元素的盒子的 ...

  7. WSGI and Paste学习笔记

    The Problem Lots of web frameworks Zope, Quixote, Webware, SkunkWeb and Twisted Web etc Applications ...

  8. 干货---stm32f103之DMA双缓冲__也算我为网络贡献的微薄之力

    思考再三:终究是要拿出一些干货--单片机基础核心代码,串口的高效率使用请这里开始.--举一反三,我只列出串口一的双dma缓冲应用范例,剩下的自己扩展.并给与了我迄今觉得最好的串口配置架构-感谢野火的高 ...

  9. Retrofit2 完全解析 探索与okhttp之间的关系

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51304204: 本文出自:[张鸿洋的博客] 之前写了个okhttputils的 ...

  10. springBoot(11)---整合Active消息队列

    Springboot整合Active消息队列 简单理解: Active是Apache公司旗下的一个消息总线,ActiveMQ是一个开源兼容Java Message Service(JMS) 面向消息的 ...