基於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∗
n0−
10.5
∗m0
01⎦
⎤⎣⎡
cos(θ
)sin(θ
)0−
sin(θ)
cos(θ)
000
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...