Datawhale 計算機視覺基礎-圖像處理(上)-Task02 幾何變換

簡介

該部分將對基本的幾何變換進行學習,幾何變換的原理大多都是相似,只是變換矩陣不同,因此,我們以最常用的平移和旋轉爲例進行學習。在深度學習領域,我們常用平移、旋轉、鏡像等操作進行數據增廣;在傳統CV領域,由於某些拍攝角度的問題,我們需要對圖像進行矯正處理,而幾何變換正是這個處理過程的基礎,因此瞭解和學習幾何變換也是有必要的。

思考幾個問題,以旋轉爲例:

  1. 變換的形式(公式)是什麼?
  2. 旋轉中心是什麼?畢竟以不同位置爲旋轉中心得到的結果是不一樣的。
  3. 採用前向映射還是反向映射?(反向映射更爲有效)
  4. 採用反向映射後,採用何種插值算法?最常用的的是雙線性插值,OpenCV也是默認如此。

學習目標

  • 瞭解幾何變換的概念與應用
  • 理解平移、旋轉的原理
  • 掌握在OpenCV框架下實現平移、旋轉操作

內容介紹

  1. 平移、旋轉的原理
  2. OpenCV代碼實踐
  3. 動手實踐

算法理論介紹

變換形式
先看第一個問題,變換的形式。與OpencV不同的是這裏採取岡薩雷斯的《數字圖像處理_第三版》的變換矩陣方式,關於OpenCV的策略可以看它的官方文檔。根據岡薩雷斯書中的描述,仿射變換的一般形式如下:

式中的T就是變換矩陣,其中 (v,w)爲原座標,(x,y) 爲變換後的座標,不同的變換對應不同的矩陣,這裏也貼出來吧,一些常見的變換矩陣及作用如下表:
在這裏插入圖片描述
也就是說,我們根據自己的目的選擇不同變換矩陣就可以了。

座標系變換
再看第二個問題,變換中心,對於縮放、平移可以以圖像座標原點(圖像左上角爲原點)爲中心變換,這不用座標系變換,直接按照一般形式計算即可。而對於旋轉和偏移,一般是以圖像中心爲原點,那麼這就涉及座標系轉換了。

我們都知道,圖像座標的原點在圖像左上角,水平向右爲 X 軸,垂直向下爲 Y 軸。數學課本中常見的座標系是以圖像中心爲原點,水平向右爲 X 軸,垂直向上爲 Y 軸,稱爲笛卡爾座標系。看下圖:

在這裏插入圖片描述
因此,對於旋轉和偏移,就需要3步(3次變換):

  • 將輸入原圖圖像座標轉換爲笛卡爾座標系;
  • 進行旋轉計算。旋轉矩陣前面已經給出了;
  • 將旋轉後的圖像的笛卡爾座標轉回圖像座標。

圖像座標系與笛卡爾座標系轉換關係:
先看下圖:
在這裏插入圖片描述
在圖像中我們的座標系通常是AB和AC方向的,原點爲A,而笛卡爾直角座標系是DE和DF方向的,原點爲D。 令圖像表示爲M×N的矩陣,對於點A而言,兩座標系中的座標分別是(0,0)和(-N/2,M/2),則圖像某像素點(x’,y’)轉換爲笛卡爾座標(x,y)轉換關係爲,x爲列,y爲行:

逆變換爲:

於是,根據前面說的3個步驟(3次變換),旋轉(順時針旋轉)的變換形式就爲,3次變換就有3個矩陣:
在這裏插入圖片描述

反向映射
看第3個問題,在岡薩雷斯的《數字圖像處理_第三版》中說的很清楚,前向映射就是根據原圖用變換公式直接算出輸出圖像相應像素的空間位置,那麼這會導致一個問題:可能會有多個像素座標映射到輸出圖像的同一位置,也可能輸出圖像的某些位置完全沒有相應的輸入圖像像素與它匹配,也就是沒有被映射到,造成有規律的空洞(黑色的蜂窩狀)。更好的一種方式是採用 反向映射(Inverse Mapping):掃描輸出圖像的位置(x,y),通過 (T^-1爲T的逆矩陣)計算輸入圖像對應的位置 (v,w),通過插值方法決定輸出圖像該位置的灰度值。

插值
第4個問題,採用反向映射後,需通過插值方法決定輸出圖像該位置的值,因此需要選擇插值算法。通常有最近鄰插值、雙線性插值,雙三次插值等,OpencV默認採用雙線性插值,我們也就採用雙線性插值。

基於OpenCV的實現(python)

原圖

1、旋轉

import cv2
import numpy as np
img = cv2.imread('miaoa.jpg',cv2.IMREAD_UNCHANGED)
row, col, channel = img.shape
# 旋轉
M = cv2.getRotationMatrix2D((col/2,row/3), 90, 0.4)
dst = cv2.warpAffine(img, M, (col, row))
cv2.imshow('img', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果

# 平移
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img, M, (col, row))
cv2.imshow('img', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果

相關技術文檔、博客、教材、項目推薦
opencv文檔
博客:

python版本:圖像的幾何變換

關於Datawhale:

Datawhale是一個專注於數據科學與AI領域的開源組織,彙集了衆多領域院校和知名企業的優秀學習者,聚合了一羣有開源精神和探索精神的團隊成員。Datawhale以“for the learner,和學習者一起成長”爲願景,鼓勵真實地展現自我、開放包容、互信互助、敢於試錯和勇於擔當。同時Datawhale 用開源的理念去探索開源內容、開源學習和開源方案,賦能人才培養,助力人才成長,建立起人與人,人與知識,人與企業和人與未來的聯結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章