OpenCV系列(九)圖像仿射變換
無論是在人臉識別或者跟蹤領域,還是在圖像處理領域,在我們做訓練或者分析局部數(shù)據之前,都需要把對應的圖像數(shù)據提取出來。但是在實際情況中,我們不一定每次都能找到水平的預測框,例如在OCR識別中,我們檢測到的文字事實上可能是歪的。這時候就需要反射變化將歪的圖片轉換成正的,以供我們進行下一步的訓練或識別。

● 場景模擬
首先,我們使用Opencv模擬出一個斜著的矩形框,并且提取出矩形框四個角的坐標,代碼如下:
import cv2import numpy as npdef get_point(th):boxes=[]contours, _ = cv2.findContours(th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)for contour in contours:if cv2.contourArea(contour) > 120000:continueelse:rect = cv2.minAreaRect(contour)boxs = cv2.boxPoints(rect)for index ,value in enumerate(boxs):print(value)x,y=valueboxes.append([int(x),int(y)])cv2.circle(img,(x,y),1,(0,255,0))cv2.putText(img,'%s'%index,(x,y),cv2.FONT_HERSHEY_COMPLEX,.5,(255,0,0),1)return boxesif __name__ == '__main__':img=cv2.imread('opencv_image/range_back.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)_,th=cv2.threshold(blur,0,255,cv2.THRESH_BINARY)points=get_point(th)cv2.imshow('img',img)cv2.waitKey(0)
程序運行結果如下,在一張白色為底色的帶有旋轉方框的圖片中,我們取到了4個頂點的坐標,分別為:左下角、左上角、右上角、右下角:

● 放射變換
取得這些坐標后,我們就可以對圖中的矩形進行矯正,把矩形變?yōu)樗降模⑻崛〕鰜怼J褂玫拇a如下:
if __name__ == '__main__':img=cv2.imread('opencv_image/range_back.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)=cv2.threshold(blur,0,255,cv2.THRESH_BINARY)points=get_point(th)# 只需要3個點就可以進行仿射變換points=np.array(points,np.float32)[:-1]# 圖片反射變換之后的對應坐標系 位置與獲取的點的位置相同new_point = np.array([[0, 150], [0, 0], [250,0]], np.float32)A1 = cv2.getAffineTransform(points, dst=new_point)d1=cv2.warpAffine(img,A1,(250,150),borderValue=125)cv2.imshow('img',img)cv2.imshow('s',d1)cv2.waitKey(0)
運行程序的結果為如下,我們把非水平的矩形提取出來,變成水平的矩形,但是這需要最少3個坐標才能完成仿射變換:

函數(shù)解析: cv2.getAffineTransform(src, dst)
作用:生成仿射變換矩陣
| src | 輸入的3個點 |
| dst | 輸出的3個點 |
函數(shù)解析:cv2.warpAffine(img,M,dsize,borderValue)
作用:進行仿射變換
| img | 輸入圖像 |
| M | 變換矩陣 |
| dsize | 輸出的圖片大小 |
| borderValue | 邊框填充,默認為0 |
評論
圖片
表情
