欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opencv實(shí)現(xiàn)文檔矯正

 更新時(shí)間:2022年08月01日 10:52:00   作者:棒子胡豆  
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)文檔矯正功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)文章

最新評(píng)論