首頁 > 軟體

opencv實現檔案矯正

2022-08-01 14:01:21

本文範例為大家分享了opencv實現檔案矯正的具體程式碼,供大家參考,具體內容如下

原始檔案

矯正後檔案

思路:

只要獲得傾斜檔案的傾斜角度,然後通過仿射變化旋轉一下就可以實現矯正了,這裡獲取傾斜角度的方法有兩個,下面分別介紹

1、利用霍夫變換,檔案內容都是平行的,首先利用利用霍夫變換檢測直線,然後將所有直線的平均傾斜角度當做檔案的傾斜角度,最後再進行仿射變換就可以了。

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)  # 旋轉中心x,旋轉中心y,旋轉角度,縮放因子
    img = cv2.warpAffine(img, M, (cols, rows),borderValue = (255,255,255))  #在記憶體裡完成了旋轉
    imshow(img)
rotateImg(img2,angle)

2、求檔案內容的最小包圍矩形。首先檢測輪廓,利用形態學操作求mask,然後再檢測輪廓,求最下包圍矩形,最小包圍矩形會返回一個傾斜角度(度數,霍夫變換的傾斜角度是弧度制),可以對輪廓進行篩選,將面積最大的輪廓的傾斜角度作為檔案的傾斜角度,然後做仿射變換。

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))
# 度數形式,霍夫變換的返回值是弧度制
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)

補充:

利用仿射變換實現影象旋轉指定度數

mat = cv2.getRotationMatrix2D(center,angle,c) (center: 旋轉中心,angle:旋轉角度,c:縮放大小)
img_final = cv2.warpAffine(img,mat, (img.shape[1],img.shape[0]), borderValue = (255,255,255)) (borderValue為可選引數,填充色,預設為黑色)

另外旋轉指定90,180,270可以使用transpose、flip來實現

旋轉90度(順時針)
img = cv2.transpose(img)
res_img = cv2.flip(img,1)

旋轉180度
img = cv2.flip(img,0)
img = cv2.flip(img,1)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com