OpenCV入门之获取图像的旋转角度
在我们的日常生活中,所碰到的图像往往都有一定的倾斜。那么,如何用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), 欢迎大家关注哦~~
OpenCV入门之获取图像的旋转角度的更多相关文章
- 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置
图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...
- 【OpenCV入门指南】第一篇 安装OpenCV
http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...
- OpenCV入门教程
OpenCV入门教程 作者:于仕琪 OpenCV入门教程.pdf
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- OpenCV入门之获取验证码的单个字符(二)
在文章 OpenCV入门之获取验证码的单个字符(字符切割)中,介绍了一类验证码的处理方法,该验证码如下: 该验证码的特点是字母之间的间隔较大,很容易就能提取出其中的单个字符.接下来,笔者将会介绍如 ...
随机推荐
- 用mplayer从视频中按周期提取帧
使用方法:extract file time step folder time 设置时间长度 step 设置周期 均以秒(s)为单位 贡献:1. 从视频文件中周期性提取图片:2. Windows下批处 ...
- java面试一、1.4锁机制
免责声明: 本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.3.锁机制 说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:当多个线程访问某一个 ...
- ADC_DMA_TIM
/************************************************************************** * 文件名:ADC.h * * 编写人:离逝的风 ...
- 下载、安装JDK并配置JDK的环境变量
概念简介: JDK:(Java Development Kit)Java语言的软件开发工具包,它包含了Java程序的开发工具和Java程序的运行环境JRE: JRE:(Java Runtime Env ...
- 转 Refresh Excel Pivot Tables Automatically Using SSIS Script Task
Refresh Excel Pivot Tables Automatically Using SSIS Script Task https://www.mssqltips.com/sqlservert ...
- “Xavier”安卓木马分析:可静默收集数据并远程代码执行
趋势科技研究发现了一款Android恶意木马——Xavier.在谷歌Play应用市场中,超过800款Android应用感染了该恶意木马,影响数百万Android用户.感染的应用范围覆盖图片编辑器,墙纸 ...
- Jenkins初级使用过程中的异常处理(1)
在使用Jenkins一些基本功能的时候,或者说是基本插件的时候,会遇到各种各样的报错.这里就设想模拟一下,重现一下以前遇到过的问题,记录一下.虽说是Jenkins使用过程中出现这样的问题,但实际上可以 ...
- 手工检测SQL注入漏洞
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
- 快速找出网站中可能存在的XSS漏洞实践(一)
一.背景 笔者最近在慕课录制了一套XSS跨站漏洞 加强Web安全视频教程,课程当中有讲到XSS的挖掘方式,所以在录制课程之前需要做大量实践案例,最近视频已经录制完成,准备将这些XSS漏洞的挖掘过程记录 ...
- 内存管理-buddy[代码]
基于2.6.32内核源码分析 首选内存区和gfp描述符关系运算 64位系统默认没有开启CONFIG_HIGHMEM选项,因此只有4个内存区DMA(0),DMA32(1),NORMAL(2),MOVAB ...