为了账号安全,请及时绑定邮箱和手机立即绑定

OpenCV入门之获取图像的旋转角度

标签:
Java

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

webp  4.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)

预处理后的图片如下:

webp  预处理后的图片

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

获取旋转角度

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

得到的图像如下:

webp  旋转后的图像

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

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

webp  识别文字

总结

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



作者:但盼风雨来_jc
链接:https://www.jianshu.com/p/a675e7ae8a3b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消