• OpenCV获取图像的旋转角度


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

     
    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)

      预处理后的图片如下: 

    预处理后的图片

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

    获取旋转角度

      对于上述预处理后的图片,可以用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的识别结果为: ''.

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

     
    识别文字

    总结

      本次获取图像的旋转角度是利用了图像中只有一个文字,而包含该文字的最小外接矩形的旋转角度就是图像的旋转角度。这只是获取图像旋转角度的一种方式,当然,还会有其他获取图像旋转角度的方法.

  • 相关阅读:
    算法---大整数相加
    Openxml入门---Openxm读取Excel数据
    一个有用的网络监控软件
    C#基础---C#如何对Json字符串处理
    C#基础---IComparable用法,实现List<T>.sort()排序
    OpenXml入门---word里面插入图片
    OpenXml入门
    OpenXml入门----给Word文档添加表格
    拼图
    小锤子
  • 原文地址:https://www.cnblogs.com/chen8023miss/p/11446260.html
Copyright © 2020-2023  润新知