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.pswp.cn/news/534889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534889.shtml
英文地址,請注明出處:http://en.pswp.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…

java ruby腳本_Java 程序中直接執行 Ruby 腳本 (JRuby)

1.[代碼]MainClass.javaimport java.io.BufferedReader;import java.io.FileReader;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public class MainClass {public static void main(String[] args) throws Excep…

python win32gui安裝_python-無法安裝win32gui

我正在嘗試使用pip安裝win32gui,但出現錯誤&#xff1a; C:\Users\?????>pip install win32gui Collecting win32gui Using cached https://files.pythonhosted.org/packages/b8/75/7bed82934e51903f9d48b26b3996161bb2dce1731607b4bb7fd26003ed3e/win32gui-221.5.tar.…

時間戳 java_java中獲取時間戳的方法

在java開發過程中經常會遇到統計某一天或是某一個月的數據&#xff0c;因此常常需要獲取截取數據的兩個時間戳(比如統計今天的數據&#xff0c;則需要獲取一個開始時間為今天零點以及一個結束時間為明天零點)&#xff0c;然后根據數據相關的時間是否在該時間區間內來判斷是否將…

求一批整數中出現最多的個位數字_C語言經典100例007-求低n-1位的數

系列文章《C語言經典100例》持續創作中&#xff0c;歡迎大家的關注和支持。喜歡的同學記得點贊、轉發、收藏哦&#xff5e;后續C語言經典100例將會以pdf和代碼的形式發放到公眾號歡迎關注&#xff1a;計算廣告生態 即時查收1 題目函數&#xff1a;unsigned fun(unsigned w)功能…

python合并多個pdf_python合并多個pdf文件

假設您有個無聊的工作&#xff0c;將幾十個PDF文檔合并成一個PDF文件。 他們每個都有封面頁作為第一頁&#xff0c;但你不希望在最終結果中重復覆蓋表。 即使有有很多免費的程序來組合PDF&#xff0c;其中許多只是合并整個文件在一起。 讓我們編寫一個Python程序來自定義哪些頁…

python class類_python類class基礎

44、class類&#xff1a;一、類定義的一般形式&#xff1a;1、簡單的形式&#xff1a;實例化對象沒有自己獨有的數據屬性。>>> class fistclass():... data1 hello world ### >這是類的數據屬性或類成員屬性。... def printdata(self): ###>這是類的方法&#…

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

參考兩篇博客&#xff1a;http://blog.csdn.net/moreevan/article/details/6697777http://blog.csdn.net/moreevan/article/details/6698529針對第二篇博客&#xff0c;看了下面的評論&#xff0c;發現子類輸出的書號其實是父類的&#xff0c;書名是自己先添加的成員變量&#…

python 徹底解讀多線程與多進程_python 多進程與多線程淺析

python多線程是偽多線程&#xff0c;同時間最多只有一個線程在執行&#xff0c;但這樣并不代碼python的多線程沒有作用&#xff0c;對于IO密集型的系統&#xff0c;python的多線程還是能極大的提升性能&#xff5e;關于python偽多線程可以去了解python GIL的概念。以下代碼涉及…

python什么軟件開發好_python怎樣才能學好?python軟件開發什么

眾所周知&#xff0c;Python是近年來熱門的編程語言之一&#xff0c;吸引了很多人參與到it行業的Python開發中來&#xff0c;但是如何學習Python編程呢?對于每一個初學Python的朋友來說&#xff0c;估計有點困惑。那么我們如何才能學好Python呢?學習Python需要什么技能?有些…

java 設計模式原則_Java設計模式的七大原則

設計原則名稱定 義使用頻率單一職責原則(Single Responsibility Principle, SRP)一個類只負責一個功能領域中的相應職責。★★★★☆開閉原則(Open-Closed Principle, OCP)軟件實體應對擴展開放&#xff0c;而對修改關閉。開閉原則的關鍵在于抽象化。★★★★★里氏代換原則(L…

python自定義模塊和三方模塊_python基礎知識8——模塊1——自定義模塊和第三方開源模塊...

模塊的認識模塊&#xff0c;用一砣代碼實現了某個功能的代碼集合。類似于函數式編程和面向過程編程&#xff0c;函數式編程則完成一個功能&#xff0c;其他代碼用來調用即可&#xff0c;提供了代碼的重用性和代碼間的耦合。而對于一個復雜的功能來&#xff0c;可能需要多個函數…

dhcp只能分配與路由器相同網段么_路由器的橋接詳解

網上關于路由器無線橋接的教程很多&#xff0c;讓你注意那注意這的&#xff0c;都沒有說明白。今天&#xff0c;我來試著縷清它們間的關系&#xff01;1、主路由器這是我主路由器目前的狀態&#xff0c;其中IP地址是我在上級光貓路由的可用ip段192.168.1.2~254里選的一個&#…

逆序對java_逆序對

求逆序對問題用歸并排序的時間復雜度比暴力算法更低。假設有一個數組{8&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;7&#xff0c;4&#xff0c;3&#xff0c;6}首先歸并排序第一次對數組進行分割 8 1 2 5 7 4 3 6二次分割 8 1 25 74 3…

python123測驗9程序題答案_Django ORM 練習題及答案_python_腳本之家

1.modles中表結構#出版社class Publisher(models.Model):name models.CharField(max_length32)city models.CharField(max_length32)def __str__(self):return "".format(self.id, self.name)#書籍class Book(models.Model):title models.CharField(max_length32)…

java父類shape_為什么該父類無法調用其子類.__ShapeCircle_public_perimeter_getType_shapej__169IT.COM...

子類:public class ShapeCircle extends Shape{protected double r;public ShapeCircle(){setside(0.0);}public ShapeCircle(double r){setside(r);}public void setside(double r){this.rr;}public double perimeter(){return Math.PI*2*r;}public String getType(){return &…

python中雙冒號的作用_python中雙冒號

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技術人對外發布原創技術內容的最大平臺&…

java電子通訊錄畢業設計_(C)JAVA001電子通訊錄(帶系統托盤)

打開Server Socket,創建一個服務器型套接字和一個普通套接字&#xff0c;服務器型套接字在指定端口為客戶端請求的Socket 服務&#xff1b;? 使用ServerSocket類的accept()方法使服務器型套接字處于監聽狀態并把監聽結果返回給普通套接字&#xff1b;? 為該普通套接字創建輸入…

python進行數據分析需要安裝哪兩個庫_對Python進行數據分析_關于Package的安裝問題...

一、為什么要使用Python進行數據分析&#xff1f;python擁有一個巨大的活躍的科學計算社區&#xff0c;擁有不斷改良的庫&#xff0c;能夠輕松的集成C,C,Fortran代碼(Cython項目)&#xff0c;可以同時用于研究和原型的構建以及生產系統的構建。二、Python的優勢與劣勢&#xff…

java orcl自動_Oracle自動生成編號

祝大家新年快樂&#xff0c;有任何問題可與我聯系&#xff1a;今天用JAVA向Oracle數據庫中插數據時&#xff0c;每次都要去計算ID&#xff0c;覺得好麻煩&#xff0c;于是想到了用數據庫自帶的ID來做&#xff0c;具體如下&#xff1a;1、首先得創建一序列序列(SEQUENCE)序列是一…