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

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

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

预处理

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

# -*- coding: utf-8 -*-

import cv2

imagepath = 'F://CHN_Char/4.png'

img = cv2.imread(imagepath, 1)

# 将图片的边缘变为白色

height, width = img.shape[0:2]

for i in range(width):

img[0, i] = [255]*3

img[height-1, i] = [255]*3

for j in range(height):

img[j, 0] = [255]*3

img[j, width-1] = [255]*3

# 去掉灰色线(即噪声)

for i in range(height):

for j in range(width):

if list(img[i,j]) == [204,213,204]:

img[i,j]=[255]*3

# 把图片转换为灰度模式

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 中值滤波

blur = cv2.medianBlur(gray, 3) # 模板大小3*3

# 二值化

ret,thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)

# 保存图片

cv2.imwrite('F://CHN_Char/char_after_bin.png', thresh)

预处理后的图片如下:

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

获取旋转角度

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

完整的Python代码如下:

# -*- coding: utf-8 -*-

import cv2

import numpy as np

imagepath = 'F://CHN_Char/char_after_bin.png'

img = cv2.imread(imagepath, -1)

image, contours, _ = cv2.findContours(img, 2, 2)

for cnt in contours:

# 最小外界矩形的宽度和高度

width, height = cv2.minAreaRect(cnt)[1]

if width* height > 100:

# 最小的外接矩形

rect = cv2.minAreaRect(cnt)

box = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点

box = np.int0(box)

if 0 not in box.ravel():

'''绘制最小外界矩形

for i in range(4):

cv2.line(image, tuple(box[i]), tuple(box[(i+1)%4]), 0) # 5

'''

# 旋转角度

theta = cv2.minAreaRect(cnt)[2]

if abs(theta) <= 45:

print('图片的旋转角度为%s.'%theta)

angle = theta

# 仿射变换,对图片旋转angle角度

h, w = img.shape

center = (w//2, h//2)

M = cv2.getRotationMatrix2D(center, angle, 1.0)

rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 保存旋转后的图片

cv2.imwrite('F://CHN_Char/after_rotated.png', rotated)

输出结果如下:

图片的旋转角度为-23.629377365112305.

得到的图像如下:

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

识别图像中的文字

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

import pytesseract

import cv2

# tesseract.exe所在的文件路径

pytesseract.pytesseract.tesseract_cmd = 'C://Program Files (x86)/Tesseract-OCR/tesseract.exe'

imagepath = 'F://CHN_Char/after_rotated.png'

image = cv2.imread(imagepath, -1)

text = pytesseract.image_to_string(image, lang='chi_sim', config='-psm 10')

print("Tesseract-OCR的识别结果为: '%s'."%text)

输出结果为:

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

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

总结

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

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

python opencv 识别角度_OpenCV入门之获取图像的旋转角度相关推荐

  1. opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度

    在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢?   我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 可以看到,该图像存在着 ...

  2. Python+OpenCV 识别银行卡卡号

    Python+OpenCV 识别银行卡卡号 今天尝试一下用python+OpenCV,使用模板匹配的方式做个简单地识别银行卡卡号(大部分参考网上的,自己改了一部分,代码写的有点不太好,但是思路很清晰, ...

  3. Python OpenCV识别行人入口进出人数统计

     程序示例精选 Python OpenCV识别行人入口进出人数统计 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对<Python OpenCV识别行 ...

  4. python opencv报错_OpenCV in Python 入门问题,python报错 -问答-阿里云开发者社区-阿里云...

    OpenCV是Intel®开源计算机视觉库.它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. 在这篇文章(译自 http://glowingpython.bl ...

  5. python图片识别-Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  6. Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  7. php 比对两张图片,Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  8. 使用Python+OpenCV进行图像处理之入门教程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 简介 人脸识别和目标检测这样的术语听起来觉得很酷,但是当涉及到从头 ...

  9. python opencv 录制视频_OpenCV Python 录制视频

    学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现了一点故障,那就是获取到的文件总是为0KB.经过一番查找,终于找到了解决办法. 调用摄像头 调用摄像头作为本实验的基础是 ...

最新文章

  1. IP 数据报首部分析
  2. php.ini var dump,php安装xdebug后var_dump()不能输变量内容解决办法
  3. Oracle单组函数
  4. [原创]有关PHP 中 MVC的个人见解
  5. 孤读Paper——《FCOS: Fully Convolutional One-Stage Object Detection》
  6. Atitit 定时器在项目的应用于 servless数据库 atikvdb 目录 1.1. 项目背景 1 1.2. 特点::免驱动。简单快捷。。 1 1.3. 功能指标 1 1.4. 模块与功能实
  7. 删除html注释 python,用Python提取HTML源码中的注释与去掉注释
  8. Clang编译Objective-C
  9. rpm -qa的意思详解
  10. 过程现场总线解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  11. 微缩脚步趋缓 摩尔定律由于EUV微影技术延迟失去动力
  12. 【软考软件评测师】第五章节 安全测试测试方法
  13. selenium firefox 启动报错 Timed out wating 45 seconds for firefox to start
  14. 戴尔电脑重装系统的blos设置
  15. 644.奇怪的打印机(困难)
  16. MPU9250的基本框架
  17. 一个资深Java架构师告诉你我们是如何将一个项目做烂的
  18. Java-POI读取excel(null的cell也读取输出)
  19. ​力扣解法汇总1037-有效的回旋镖
  20. AB变频器常见故障的原因

热门文章

  1. SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论
  2. 另一种ABAP解析XML file的方式
  3. 如何处理SAP CRM错误消息the item category X is not permitted
  4. x79主板bios设置中文_bios菜单
  5. python运行程序的快捷键_在Python集成开发环境中,可使用快捷键()运行程序。...
  6. eclipse无法创建java虚拟机_2020年哪些IDE是最适合Java开发人员的?
  7. deinstall 卸载grid_oracle 11g RAC手动卸载grid,no deinstall   .
  8. python模型预测_python:目标检测模型预测准确度计算方式(基于IoU)
  9. mysql8.0新用户无法连接_mysql 8.0.16 Linux新建用户无法登录
  10. Xilinx FPGA PLL 资源与INTEL FPGA PLL资源locked信号的不同