1. 幾何變換
圖像的幾何變換是指將一幅圖像中的坐標(biāo)位置映射到另一幅圖像中的新坐標(biāo)位置,其實(shí)質(zhì)是改變像素的空間位置,估算新空間位置上的像素值。幾何變換不改變圖像的像素值,只是在圖像平面上進(jìn)行像素的重新安排。
以下是常用的幾種幾何變換:
旋轉(zhuǎn):將圖像旋轉(zhuǎn)指定角度。
縮放:按縮放因子調(diào)整圖像大小,使其變大或變小。
平移:將圖像從當(dāng)前位置移動到新位置。
錯切:沿特定軸傾斜圖像。
仿射變換:一個更廣泛的類別,包括單個變換中的縮放、旋轉(zhuǎn)、錯切和平移。
透視變換:此變換模擬 3D 空間中的透視效果,允許進(jìn)行更復(fù)雜的操作,例如校正由攝像機(jī)角度引起的扭曲。
幾何變換通常使用數(shù)學(xué)函數(shù)和變換矩陣來實(shí)現(xiàn)。這些矩陣定義了原始圖像中的每個像素如何映射到轉(zhuǎn)換圖像中的新位置。
2. 仿射變換
2.1 仿射變換
圖像處理中的仿射變換是指對圖像進(jìn)行一次線性變換和平移,將其映射到另一個圖像空間的過程。仿射變換可以保持圖像的“平直性”,即直線經(jīng)過仿射變換后依然為直線,平行線經(jīng)過仿射變換后依然為平行線。
通常,使用 2x3 大小數(shù)組 M 來進(jìn)行仿射變換。數(shù)組由兩個矩陣 A、B 組成,其中矩陣 A(大小為2x2)用于矩陣乘法,矩陣 B(大小為2x1)用于向量加法。
其中:
由于縮放和旋轉(zhuǎn)是通過矩陣乘法來實(shí)現(xiàn),平移是通過矩陣加法來實(shí)現(xiàn)的,將這幾個操作都用一個矩陣實(shí)現(xiàn)所以構(gòu)造出上面的 2x3 矩陣 M。
仿射變換是從二維坐標(biāo)到二維坐標(biāo)之間的線性變換,且為了保持二維圖像的“平直性”和“平行性”。我們需要引入齊次坐標(biāo)的概念,最終得到的齊次坐標(biāo)矩陣表示形式為:
2.2 齊次坐標(biāo)
在數(shù)學(xué)里,齊次坐標(biāo)(homogeneous coordinates),或投影坐標(biāo)(projective coordinates)是指一個用于投影幾何里的坐標(biāo)系統(tǒng),如同用于歐氏幾何里的笛卡兒坐標(biāo)一般。齊次坐標(biāo)可讓包括無窮遠(yuǎn)點(diǎn)的點(diǎn)坐標(biāo)以有限坐標(biāo)表示。使用齊次坐標(biāo)的公式通常會比用笛卡兒坐標(biāo)表示更為簡單,且更為對稱。
引入齊次坐標(biāo)的目的是為了更好的表示無限遠(yuǎn)(infinity)的坐標(biāo)的概念,在歐式空間中,無限大或者無限小的坐標(biāo)的并不存在,不能用數(shù)值表示。數(shù)學(xué)家 August Ferdinand M?bius(1) 提出了齊次坐標(biāo)系,采用 N+1 個量來表示 N 維坐標(biāo)。
例如,在二維齊次坐標(biāo)系中,我們引入一個量 w,將一個二維點(diǎn) (x,y) 表示為 (X,Y,w) 的形式,其轉(zhuǎn)換關(guān)系為
其中,w 可以為任意值。
在笛卡爾坐標(biāo)系中以(1,2)為例,在齊次坐標(biāo)系中可以用(1,2,1)表示,也可以用(2,4,2)表示,還可以用 (4,8,4),(8,16,8)...表示,即 (k,2k,k),k∈ R 這些點(diǎn)都映射到歐式空間中的一點(diǎn),即這些點(diǎn)具有 尺度不變性(Scale Invariant),是“齊性的”(同族的),所以稱之為齊次坐標(biāo)。
“齊次坐標(biāo)表示是計(jì)算機(jī)圖形學(xué)的重要手段之一,它既能夠用來明確區(qū)分向量和點(diǎn),同時也更易用于進(jìn)行仿射(線性)幾何變換。”——出自《計(jì)算機(jī)圖形學(xué)(OpenGL版)》的作者 F.S. Hill Jr.
通過齊次坐標(biāo)還可以證明兩條平行線可以相交,非常有意思。
3. 仿射變換中常見的變換形式
OpenCV 提供了 warpAffine() 函數(shù)實(shí)現(xiàn)仿射變換。它可以用于實(shí)現(xiàn)各種圖像幾何變換,例如平移、縮放、旋轉(zhuǎn)、錯切等。
voidwarpAffine(InputArraysrc,OutputArraydst, InputArrayM,Sizedsize, intflags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, constScalar&borderValue=Scalar());
第一個參數(shù) src: 輸入圖像,可以是單通道或多通道圖像。
第二個參數(shù) dst: 輸出圖像,與輸入圖像同類型和大小。
第三個參數(shù) M: 仿射變換矩陣,2x3 的浮點(diǎn)數(shù)矩陣。
第四個參數(shù) dsize: 輸出圖像的大小。
第五個參數(shù) flags: 插值方式,默認(rèn)值為 INTER_LINEAR,表示使用雙線性插值。
第六個參數(shù) borderMode: 邊界模式,默認(rèn)值為BORDER_CONSTANT,表示使用常量值填充邊界。
第七個參數(shù) borderValue: 邊界填充值,默認(rèn)值為0。
3.1 平移
圖像平移的公式:
下面的代碼,分別實(shí)現(xiàn)了對圖像沿著 x 軸、y 軸進(jìn)行平移
#include#include #include usingnamespacestd; usingnamespacecv; intmain(){ Matsrc=imread(".../girl.jpg"); imshow("src",src); intwidth=src.cols; intheight=src.rows; Matdst; Matwarp_matrix=(cv::Mat_ (2,3)<<1,?0,?400,?0,?1,?0); ????warpAffine(src,?dst,?warp_matrix,?Size(width,?height),?INTER_LINEAR); ????imshow("Shift?along?X-axis",?dst); ????warp_matrix?=?(cv::Mat_ (2,3)<<1,?0,?0,?0,?1,?400); ????cv::warpAffine(src,?dst,?warp_matrix,?Size(width,?height),?INTER_LINEAR); ????cv::imshow("Shift?along?Y-axis",?dst); ????waitKey(0); ????return?0; }
平移變換.png
3.2 縮放
圖像縮放的公式:
下面的代碼,分別實(shí)現(xiàn)了對圖像進(jìn)行0.75和1.25倍的縮放。
#include#include #include usingnamespacestd; usingnamespacecv; intmain(){ Matsrc=imread(".../girl.jpg"); imshow("src",src); intwidth=src.cols; intheight=src.rows; //設(shè)置縮放比例 floatscale=0.75; Matdst; Matwarp_matrix=(cv::Mat_ (2,3)< (2,3)<
縮放變換.png
3.3 旋轉(zhuǎn)
圖像旋轉(zhuǎn)的公式:
OpenCV 提供了更為簡潔的 getRotationMatrix2D() 函數(shù)用于生成一個 2x3 的仿射變換矩陣,該矩陣可以用于對圖像進(jìn)行旋轉(zhuǎn)操作。
MatgetRotationMatrix2D(Point2fcenter,doubleangle,doublescale);
第一個參數(shù) center: 圖像旋轉(zhuǎn)中心,以像素為單位。
第二個參數(shù) angle: 旋轉(zhuǎn)角度,以度為單位。逆時針方向?yàn)檎?/p>
第三個參數(shù) scale: 旋轉(zhuǎn)后的圖像縮放比例。
下面的代碼,展示了以圖像的中心作為旋轉(zhuǎn)中心,并且逆時針方向旋轉(zhuǎn)45度。
#include#include #include usingnamespacestd; usingnamespacecv; intmain(){ Matsrc=imread(".../girl.jpg"); imshow("src",src); intwidth=src.cols; intheight=src.rows; Pointcenter=Point(width/2,height/2); doubleangle=45; doublescale=1.0; Matdst; Matwarp_matrix=getRotationMatrix2D(center,angle,scale); warpAffine(src,dst,warp_matrix,Size(width,height),INTER_LINEAR); imshow("Rotate",dst); waitKey(0); return0; }
旋轉(zhuǎn)變換.png
3.4 錯切
圖像錯切的公式:
下面的例子,展示圖像的錯切。
#include#include #include usingnamespacestd; usingnamespacecv; intmain(){ Matsrc=imread(".../girl.jpg"); imshow("src",src); intwidth=src.cols; intheight=src.rows; floata=0.25; floatb=0.5; Matdst; Matwarp_matrix=(cv::Mat_ (2,3)<<1,?a,?0,?b,?1,?0); ????warpAffine(src,?dst,?warp_matrix,?Size(width,?height),?INTER_LINEAR); ????imshow("Shearing",?dst); ????waitKey(0); ????return?0; }
錯切變換.png
4. 總結(jié)
圖像仿射變換是一種簡單而有效的圖像幾何變換方法,在圖像處理和計(jì)算機(jī)視覺領(lǐng)域有著廣泛的應(yīng)用。它可以用于圖像矯正、增強(qiáng)、配準(zhǔn)、合成、目標(biāo)識別和跟蹤等多種任務(wù)。
審核編輯:劉清
-
圖像處理
+關(guān)注
關(guān)注
27文章
1300瀏覽量
56894 -
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1700瀏覽量
46129 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41556
原文標(biāo)題:OpenCV筑基之圖像的仿射變換
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論