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

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

f8c870f285b0d4ed7e990e0c84484f45.png

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

预处理

图像的预处理包括去除边缘,去除噪声(两条灰色线),滤波,二值化等,具体处理的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)

预处理后的图片如下:

50a10c8228e32939a5438cfb06fdf986.png

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

获取旋转角度

对于上述预处理后的图片,可以用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.

得到的图像如下:

03590eda4558d1277658b5a68ef5acc0.png

在上述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的识别结果为: '知'.

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

e860573f3838004e60d96bccdf23c540.png

总结

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

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

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

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

相关文章

后台使用orm多还是直接sql_Django应用app创建及ORM

Django应用app创建及ORM一.重要知识点回顾:1. form表单提交数据的注意事项&#xff1a;1. 是form不是from,必须要有method和action (action用来指定你的数据提交到后台哪个地方&#xff0c;method用来指定你提交数据的方式)2. 所有获取用户输入的表单标签要放在form表单里面&am…

求一批整数中出现最多的个位数字_C语言经典100例007-求低n-1位的数

系列文章《C语言经典100例》持续创作中&#xff0c;欢迎大家的关注和支持。喜欢的同学记得点赞、转发、收藏哦&#xff5e;后续C语言经典100例将会以pdf和代码的形式发放到公众号欢迎关注&#xff1a;计算广告生态 即时查收1 题目函数&#xff1a;unsigned fun(unsigned w)功能…

java文件序列化_Java序列化与反序列化,文件操作

参考两篇博客&#xff1a;http://blog.csdn.net/moreevan/article/details/6697777http://blog.csdn.net/moreevan/article/details/6698529针对第二篇博客&#xff0c;看了下面的评论&#xff0c;发现子类输出的书号其实是父类的&#xff0c;书名是自己先添加的成员变量&#…

python自定义模块和三方模块_python基础知识8——模块1——自定义模块和第三方开源模块...

模块的认识模块&#xff0c;用一砣代码实现了某个功能的代码集合。类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来&#xff0c;可能需要多个函数…

dhcp只能分配与路由器相同网段么_路由器的桥接详解

网上关于路由器无线桥接的教程很多&#xff0c;让你注意那注意这的&#xff0c;都没有说明白。今天&#xff0c;我来试着缕清它们间的关系&#xff01;1、主路由器这是我主路由器目前的状态&#xff0c;其中IP地址是我在上级光猫路由的可用ip段192.168.1.2~254里选的一个&#…

java orcl自动_Oracle自动生成编号

祝大家新年快乐&#xff0c;有任何问题可与我联系&#xff1a;今天用JAVA向Oracle数据库中插数据时&#xff0c;每次都要去计算ID&#xff0c;觉得好麻烦&#xff0c;于是想到了用数据库自带的ID来做&#xff0c;具体如下&#xff1a;1、首先得创建一序列序列(SEQUENCE)序列是一…

import java.awt.BorderLayout;_Swing-布局管理器之BorderLayout(边界布局)-入门

边界布局管理器(BorderLayout)把容器的的布局分为五个位置&#xff1a;CENTER、EAST、WEST、NORTH、SOUTH。依次对应为&#xff1a;上北(NORTH)、下南(SOUTH)、左西(WEST)、右东(EAST)&#xff0c;中(CENTER)&#xff0c;如下图所示。特征&#xff1a;l 可以把组件放在这五个位…

java 建造者实际中的用法_java中j建造者模式详解和使用方法

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。介绍意图&#xff1a;将一个复杂的…

jsp测试mysql_Jsp登陆与MySQL对接验证

最近在做一个Web项目&#xff0c;账户登陆验证是Web项目中必不可少的环节&#xff0c;所以需要阶段性的记录&#xff0c;帮助自己更好的掌握其中的知识。Jsp登陆涉及到POST方法参数获取&#xff0c;以及MySQL数据库信息的获取。可能因为自己是新手&#xff0c;刚开始写的项目有…

数据归一化处理方法_科研常用的实验数据分析与处理方法

科研常用的实验数据分析与处理方法对于每个科研工作者而言&#xff0c;对实验数据进行处理是在开始论文写作之前十分常见的工作之一。但是&#xff0c;常见的数据分析方法有哪些呢&#xff1f;常用的数据分析方法有&#xff1a;聚类分析、因子分析、相关分析、对应分析、回归分…

信息系统项目管理师_信息系统项目管理师通过率是多少?

答&#xff1a;信息系统项目管理师考试每个地区的通过率都是不一样的&#xff0c;一般全国在10%-20%左右&#xff0c;这个20%的通过率是按参考人数作为统计&#xff0c;就是除去了那些报名了但是没去参加考试的考生&#xff0c;如果算上所有报名考生的通过率数据&#xff0c;那…

类型“unknown”上不存在属性“foreach”_JavaScript红宝书第四版精简解析系列--映射Map数据类型...

Map数据类型顾名思义也就是映射类型,包含一个[[Entries]]私有特性我们可以使用一个二维数组作为初始值const map1 new Map([[1, 1],[2, 2],[3, 3],]); console.log("Map数据类型>", map1);当然也可以使用迭代器进行初始化const map2 new Map({[Symbol.iterator]…

java面试笔试题整理(学习java基础理论最好的资料)_2020Java笔试/面试题(持续收集整理更新)...

说明&#xff1a;java本篇用于收集知识点方便随时巩固&#xff0c;持续更新与纠错。数组关于JDK版本&#xff0c;若无特殊说明&#xff0c;默认为JDK 1.8,。缓存关于JVM版本&#xff0c;若无特殊说明&#xff0c;默认为 HotSpot。安全目录数据结构1、Java 基础1.1 Java中的基本…

使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...

Unixbench是一个类unix系统(Unix&#xff0c;BSD&#xff0c;Linux)下的性能测试工具&#xff0c;一个开源工具&#xff0c;被广泛用与测试linux系统主机的性能&#xff0c;简称UB。Unixbench的主要测试项目有&#xff1a;系统调用、读写、进程、图形化测试、2D、3D、管道、运算…

java.io.file.sync_Java(25)IO流和File类

IO流File类File类讲IO流之前先来讲以下File类。Java的标准库Java.io提供了File类来操作文件和目录。操作可以有&#xff1a;新建、删除、重命名等&#xff0c;但是不能访问文件本身的内容&#xff0c;如果想要访问&#xff0c;需要使用IO流。新建File对象:package day01;import…

val_loss突然变很大_女朋友突然变得很冷淡是怎么回事?该怎么办

原本和女朋友恋爱之后她一直都表现得比较比较热情&#xff0c;但是最近这段时间她突然对自己冷淡起来&#xff0c;很多男生可能就会很疑惑&#xff1a;女朋友突然变得很冷淡是怎么回事&#xff1f;该怎么办呢&#xff1f;一、女朋友突然变得很冷淡原因不管怎么说&#xff0c;女…

进程调度rr算法java实现_Java实现进程调度算法(二) RR(时间片轮转)

一、概述因为这次os作业对用户在控制台的输入输出有要求&#xff0c;所以我花了挺多的代码来完善控制台的显示。也因为我这次要实现多个类似算法&#xff0c;所以将一些共性单独提取出来作为一个类。如果只想要和算法有关的核心代码&#xff0c;看RR类的calc()即可。实现思路&a…

string 长度_String源码解析

本章源码分析基于JDK1.7实现的接口String类被final修饰词修饰&#xff0c;代表不可修改的特性&#xff0c;它实现了三个接口&#xff0c;Serializable是序列化接口&#xff0c;Compareble是排序接口&#xff0c;Char是字符序列接口。主要成员变量char[]&#xff1a;String通过c…

将你一张表的值覆盖_山西联通携手华为完成长风商务区宏微协同,立体覆盖,打造5G精品网络...

近日&#xff0c;中国联通山西分公司(以下简称“山西联通”)在太原长风商务区继5G CA超高速率升级之后&#xff0c;又针对长风商务区两层活动区域进行了5G宏微协同的立体覆盖&#xff0c;实现了该区域5G网络的连续部署。长风商务区建筑结构设计新颖&#xff0c;占地面积3.06平方…

局域网内文件传输速度_详解蒲公英路由器组网 实现文件共享

蒲公英路由器&#xff0c;除了具备普通路由器的功能之外&#xff0c;如图&#xff1a;最大的特色是可以实现智能组网&#xff1a;最大的特色是可以实现智能组网&#xff1a;采用全新自主研发的Cloud VPN技术替代传统VPN&#xff0c;基于SD-WAN智能组网方案&#xff0c;快速组建…