該部分將對基本的幾何變換進行學習,幾何變換的原理大多都是相似,只是變換矩陣不同,因此,我們以最常用的平移和旋轉為例進行學習。在深度學習領域,我們常用平移、旋轉、映象等操作進行資料增廣;在傳統cv領域,由於某些拍攝角度的問題,我們需要對影象進行矯正處理,而幾何變換正是這個處理過程的基礎,因此了解和學習幾何變換也是有必要的。
這次我們帶著幾個問題進行,以旋轉為例:
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個矩陣:
(為t的逆矩陣)計算輸入影象對應的位置 (v,w),通過插值方法決定輸出影象該位置的灰度值。
第4個問題,採用反向對映後,需通過插值方法決定輸出影象該位置的值,因此需要選擇插值演算法。通常有最近鄰插值、雙線性插值,雙三次插值等,opencv預設採用雙線性插值,我們也就採用雙線性插值。
仿射變換
# 原圖的高、寬
h, w = img.shape[:2]
# 仿射變換矩陣,縮小2倍
a1 = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
d1 = cv.warpaffine(img, a1, (w, h), bordervalue=0)
# 先縮小2倍,再平移
a2 = np.array([[0.5, 0, w / 4], [0, 0.5, h / 4]], np.float32)
d2 = cv.warpaffine(img, a2, (w, h), bordervalue=0)
# 在d2的基礎上,繞影象的中心點旋轉
a3 = cv.getrotationmatrix2d((w / 2.0, h / 2.0), 30, 1)
d3 = cv.warpaffine(d2, a3, (w, h), bordervalue=0)
# 如果要選擇插值的方法可以通過引數flags設定,如flags=cv.inter_cubic
幾何旋轉
h, w = img.shape[:2]
# 影象旋**cv2.rotate_180,cv2.rotate_90_counterclockwise
rota = cv.rotate(img, cv.rotate_90_counterclockwise)
# 仿射變換矩陣的方式
opencv文件:
部落格:python版本:
opencv--python 影象的幾何變換
Task02 動態規劃
1.最長回文子串 class solution def longestpalindrome self,s str str n len s dp false n for in range n ans 列舉子串的長度 l 1 for l in range n 列舉子串的起始位置 i,這樣可以通過 j i...
新聞推薦競賽 task02
資料分析的價值主要在於熟悉了解整個資料集的基本情況包括每個檔案裡有哪些資料,具體的檔案中的每個字段表示什麼實際含義,以及資料集中特徵之間的相關性,在推薦場景下主要就是分析使用者本身的基本屬性,文章基本屬性,以及使用者和文章互動的一些分布,這些都有利於後面的召回策略的選擇,以及特徵工程。建議 當特徵工...
python基礎訓練task02
我們準備利用17天時間,將 python 基礎的刻意練習分為如下任務 task01 變數 運算子與資料型別 1day task02 條件與迴圈 1day task03 列表與元組 2day task04 字串與序列 1day task05 函式與lambda表示式 2day task06 字典與集合...