opencv實(shí)現(xiàn)文檔矯正
本文實(shí)例為大家分享了opencv實(shí)現(xiàn)文檔矯正的具體代碼,供大家參考,具體內(nèi)容如下
原始文檔
矯正后文檔
思路:
只要獲得傾斜文檔的傾斜角度,然后通過(guò)仿射變化旋轉(zhuǎn)一下就可以實(shí)現(xiàn)矯正了,這里獲取傾斜角度的方法有兩個(gè),下面分別介紹
1、利用霍夫變換,文檔內(nèi)容都是平行的,首先利用利用霍夫變換檢測(cè)直線,然后將所有直線的平均傾斜角度當(dāng)做文檔的傾斜角度,最后再進(jìn)行仿射變換就可以了。
import cv2 import numpy as np def imshow(img): ? ? cv2.imshow("img",img) ? ? cv2.waitKey(0) ? ? cv2.destroyAllWindows() img = cv2.imread("2.png",1) img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)? img2 = img.copy() img_canny = cv2.Canny(img,75,200)? img_line = cv2.HoughLines(img_canny,1,np.pi/180,280) average = 0 for line in img_line:? ? ? for rho,theta in line: ? ? ? ? average = average + theta? average = average / len(img_line) angel = average/np.pi * 180 - 90 def rotateImg(img,angel): ? ? rows, cols = img.shape ? ? M = cv2.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), angel, 1) ?# 旋轉(zhuǎn)中心x,旋轉(zhuǎn)中心y,旋轉(zhuǎn)角度,縮放因子 ? ? img = cv2.warpAffine(img, M, (cols, rows),borderValue = (255,255,255)) ?#在內(nèi)存里完成了旋轉(zhuǎn) ? ? imshow(img) rotateImg(img2,angle)
2、求文檔內(nèi)容的最小包圍矩形。首先檢測(cè)輪廓,利用形態(tài)學(xué)操作求mask,然后再檢測(cè)輪廓,求最下包圍矩形,最小包圍矩形會(huì)返回一個(gè)傾斜角度(度數(shù),霍夫變換的傾斜角度是弧度制),可以對(duì)輪廓進(jìn)行篩選,將面積最大的輪廓的傾斜角度作為文檔的傾斜角度,然后做仿射變換。
import cv2 import numpy as np def imshow(img): ? ? cv2.imshow("img",img) ? ? cv2.waitKey(0) ? ? cv2.destroyAllWindows() img = cv2.imread("2.png",1) img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)? img2 = img.copy() imgth = cv2.threshold(img,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1] kernel = np.ones((17,17)) img_open = cv2.morphologyEx(imgth,cv2.MORPH_CLOSE,kernel,10) # imshow(img_open) cons = cv2.findContours(img_open,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0] areas = [] for con in cons: ? ? area = cv2.contourArea(con) ? ? areas.append(area) index = areas.index(max(areas)) # 度數(shù)形式,霍夫變換的返回值是弧度制 rect = cv2.minAreaRect(cons[index]) angle = rect[2] mat = cv2.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),angle,1) img_fin = cv2.warpAffine(img,mat,(img.shape[1],img.shape[0]),borderValue = (255,255,255)) imshow(img_fin)
補(bǔ)充:
利用仿射變換實(shí)現(xiàn)圖像旋轉(zhuǎn)指定度數(shù)
mat = cv2.getRotationMatrix2D(center,angle,c) (center: 旋轉(zhuǎn)中心,angle:旋轉(zhuǎn)角度,c:縮放大?。?br />img_final = cv2.warpAffine(img,mat, (img.shape[1],img.shape[0]), borderValue = (255,255,255)) (borderValue為可選參數(shù),填充色,默認(rèn)為黑色)
另外旋轉(zhuǎn)指定90,180,270可以使用transpose、flip來(lái)實(shí)現(xiàn)
旋轉(zhuǎn)90度(順時(shí)針)
img = cv2.transpose(img)
res_img = cv2.flip(img,1)
旋轉(zhuǎn)180度
img = cv2.flip(img,0)
img = cv2.flip(img,1)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python?random模塊常用函數(shù)基礎(chǔ)教程
這篇文章主要為大家介紹了python?random模塊常用函數(shù)基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Python爬取用戶觀影數(shù)據(jù)并分析用戶與電影之間的隱藏信息!
看電影前很多人都喜歡去 『豆瓣』 看影評(píng),所以我爬取44130條 『豆瓣』 的用戶觀影數(shù)據(jù),分析用戶之間的關(guān)系,電影之間的聯(lián)系,以及用戶和電影之間的隱藏關(guān)系,需要的朋友可以參考下2021-06-06Python使用selenium + headless chrome獲取網(wǎng)頁(yè)內(nèi)容的方法示例
這篇文章主要介紹了Python使用selenium + headless chrome獲取網(wǎng)頁(yè)內(nèi)容的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Python實(shí)現(xiàn)對(duì)字符串的加密解密方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)字符串的加密解密方法,結(jié)合實(shí)例形式分析了Python使用PyCrypto模塊進(jìn)行DES加密解密的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04Python實(shí)現(xiàn)Pig Latin小游戲?qū)嵗a
這篇文章主要介紹了Python實(shí)現(xiàn)Pig Latin小游戲?qū)嵗a,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02python分布式爬蟲(chóng)中消息隊(duì)列知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是python分布式爬蟲(chóng)中消息隊(duì)列知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以參考下。2020-11-11Python Sqlite3以字典形式返回查詢結(jié)果的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Python Sqlite3以字典形式返回查詢結(jié)果的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10Python使用openpyxl批量處理數(shù)據(jù)
openpyxl 是一個(gè)用于處理 xlsx 格式Excel表格文件的第三方python庫(kù),其支持Excel表格絕大多數(shù)基本操作。本文給大家介紹Python使用openpyxl批量處理數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧2021-06-06Python?一篇文章看懂Python集合與字典數(shù)據(jù)類型
集合并不是一種數(shù)據(jù)處理類型,而是一種中間類型。集合(set)是一個(gè)無(wú)序、不重復(fù)的元素序列,經(jīng)常被用來(lái)處理兩個(gè)列表進(jìn)行交并差的處理性。本文將詳細(xì)講解集合的一些常用方法,感興趣的可以了解一下2022-03-03python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01