<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV系列(九)圖像仿射變換

          共 2238字,需瀏覽 5分鐘

           ·

          2021-03-26 12:28

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


          ● 場景模擬

          首先,我們使用Opencv模擬出一個斜著的矩形框,并且提取出矩形框四個角的坐標,代碼如下:

          import cv2import numpy as np
          # 獲得二值圖片的最小外接矩形def get_point(th): boxes=[] contours, _ = cv2.findContours(th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: # 矩形面積過大則舍去 if cv2.contourArea(contour) > 120000: continue # 獲得最小外接矩形的4個坐標 else: rect = cv2.minAreaRect(contour) boxs = cv2.boxPoints(rect) for index ,value in enumerate(boxs): print(value) x,y=value boxes.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)    _,th=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



          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91精品系列 | 免费黄片视频在线观看 | 亚洲无码我不卡 | 欧美亚洲成人视频 | 俺来也俺也去精品一区 |