Datawhale 2 幾何變換

2021-10-05 09:41:14 字數 3336 閱讀 5624

基於opencv的實現

變換的形式(公式)是什麼?

旋轉中心是什麼?

採取前向對映還是方向對映?

採取方向對映後,採用何種插值演算法?

仿射變換:平移、旋轉、放縮、剪下、反射

對於旋轉和偏移,需要3步

將輸入原圖影象座標轉換為笛卡爾座標系;

進行旋轉計算

將旋轉後的影象的笛卡爾座標轉回影象座標

影象座標系與笛卡爾座標轉換關係

座標約定

得到乙個m行和n列的影象,我們稱這個影象的大小為m*n

(a)多數影象處理書籍中所用的座標約定(b)影象處理工具箱中所用的座標約定

點a而言,兩座標係中的座標分別是(0,0)和(-n/2,m/2),則影象某畫素點(x』,y』)轉換為笛卡爾座標(x,y)轉換關係為,x為列,y為行:

x =x

『−n/

2y=−

y『+m

/2x = x^『-n/2 \\ y = -y^『+m/2

x=x『−n

/2y=

−y『+

m/2逆變換為:

x 『=

x+n/

2y『=

−y+m

/2x^『 = x+n/2\\ y^『 = -y+m/2

x『=x+n

/2y『

=−y+

m/2於是,根據前面說的3個步驟(3次變換),旋轉(順時針旋轉)的變換形式就為,3次變換就有3個矩陣:

( x,

y,1)

=(x『

,y『,

1)t=

(x『,

y『,1

)[10

00−1

0−0.5∗

n0.5∗m

1][cos⁡(

θ)−sin⁡(

θ)0sin⁡(

θ)cos⁡(θ

)000

1][1

000−

100.5∗

n0.5∗m

1](x, y, 1)=(x^『, y^『, 1) t=(x^『, y^『, 1)\left[\begin 1 & 0 & 0 \\ 0 & -1 & 0 \\ -0.5 * n & 0.5 * m & 1 \end\right]\left[\begin \cos (\theta) & -\sin (\theta) & 0 \\ \sin (\theta) & \cos (\theta) & 0 \\ 0 & 0 & 1 \end\right]\left[\begin 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0.5 * n & 0.5 * m & 1 \end\right]

(x,y,1

)=(x

『,y『

,1)t

=(x『

,y『,

1)⎣⎡

​10−

0.5∗

n​0−

10.5

∗m​0

01​⎦

⎤​⎣⎡

​cos(θ

)sin(θ

)0​−

sin(θ)

cos(θ)

0​00

1​⎦⎤

​⎣⎡​

100.

5∗n​

0−10

.5∗m

​001

​⎦⎤​

函式warpaffined

cv2.warpaffine(inputarray src,      // 輸入影象

outputarray dst, // 輸出影象

inputarray m, // 為inputarray型別的2×3變換矩陣

size dsize, // 輸出影象的大小

int flags=inter_linear, // 插值方法識別符號

intbordermode=border_constant, // 邊界畫素模式

const scalar& bordervalue=scalar() // 在恆定的邊界情況下取值

)

函式getrotationmatrix2d

mat getrotationmatrix2d(point2f center, //源影象的旋轉中心

double angle, //旋轉角度(正值表示逆時針旋轉,座標原點左上角)

double scale //縮放係數

)

1.旋轉
cv::mat src = cv::imread("lenna.jpg");

cv::mat dst;

//旋轉角度

double angle = 45;

cv::size src_sz = src.size();

cv::size dst_sz(src_sz.height, src_sz.width);

int len = std::max(src.cols, src.rows);

//指定旋轉中心(影象中點)

cv::point2f center(len / 2., len / 2.);

//獲取旋轉矩陣(2x3矩陣)

cv::mat rot_mat = cv::getrotationmatrix2d(center, angle, 1.0);

//根據旋轉矩陣進行仿射變換

cv::warpaffine(src, dst, rot_mat, dst_sz);

//顯示旋轉效果

cv::imshow("image", src);

cv::imshow("result", dst);

cv::waitkey(0);

return 0;

dst_sz);

//顯示旋轉效果

cv::imshow("image", src);

cv::imshow("result", dst);

cv::waitkey(0);

return 0;

2 幾何變換 算數運算

匯入工具包 from imutils import 讀入 影象加法 print cv2.add np.uint8 200 np.uint8 100 普通加法 print np.uint8 200 np.uint8 100 255 44 影象減法 print cv2.subtract np.uint8...

幾何變換 remap

影像幾何變換是將一幅影像的座標位置,對映到新座標位置,這種幾何變換不改變畫素值,只是在平面上進行畫素位置的重新安排,opencv提供remap 來進行幾何轉換,分以下兩部分 opencv的remap 函式需要輸入mapx和mapy兩個影像,這兩個影像尺寸和輸入圖相同,分別表示新的x和y的位置,假設d...

幾何變換詳解

在三維圖形學中,幾何變換大致分為三種,平移變換 translation 縮放變換 scaling 旋轉變換 rotation 以下討論皆針對directx,所以使用左手座標系。將三維空間中的乙個點 x,y,z,1 移動到另外乙個點 x y z 1 三個座標軸的移動分量分別為dx tx,dy ty,d...