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的識別結果為: ''.

  因此,我們得到的圖像的旋轉角度是正確的。當然,借用以上方法,還可以識別以下圖片中的文字:

 
識別文字

總結

  本次獲取圖像的旋轉角度是利用了圖像中只有一個文字,而包含該文字的最小外接矩形的旋轉角度就是圖像的旋轉角度。這只是獲取圖像旋轉角度的一種方式,當然,還會有其他獲取圖像旋轉角度的方法.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM