您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C++ opencv圖像處理怎么實現圖片幾何變換”,內容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“C++ opencv圖像處理怎么實現圖片幾何變換”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
圖像的幾何變換不改變圖像的像素值,而是改變像素所在的幾何位置,從變換的性質來分,圖像的幾何變換有圖像的位置變換(平移,鏡像,旋轉)、圖像的形狀變換(放大,縮小,錯切)等基本變換,以及圖像的復合變換等,
圖像平移是將一幅圖像中所有的點都按照指定的平移量在水平,垂直方向移動,平移后的圖像與原圖像相同,平移后的圖像上的每一個點都可以在原圖像中找到對應的點。圖像是由像素組成,假設原來的像素坐標為(x0,y0),經過平移量(△x,△y)坐標變?yōu)椋▁1,y1)
用數學可以表示:x1=x0+△x,y1=y0+△xy
平移變換分為兩種,一種是圖像大小改變,這樣最后的原圖像會有一部分不在圖像中,另一種是圖像大小改變,這樣可以保全原圖像的內容
#include<iostream> #include<opencv.hpp> using namespace std; using namespace cv; int main() { Mat img1; img1 = imread("貓1.jpg"); imshow("原圖", img1); int r = img1.rows; int c = img1.cols; int x0 = 100; int y0 = 100; Mat img2(img1.size(), img1.type()); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { int x = j - x0; int y = i - y0; if (x >= 0 && y >= 0 && x < c&&y < r) { img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x]; } } } imshow("不改變圖像大小", img2); waitKey(0); }
效果如下:
代碼如下(示例):
int main() { Mat img1; img1 = imread("貓1.jpg"); imshow("原圖", img1); int x0 = 100; int y0 = 100; int r = img1.rows + y0; int c = img1.cols + x0; Mat img2(r,c, img1.type()); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { int x = j - x0; int y = i - y0; if (x >= 0 && y >= 0 && x < c&&y < r) { img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x]; } } } imshow("改變圖像大小", img2); waitKey(0); }
效果如下:
圖像旋轉是數字圖像處理的一個非常重要的環(huán)節(jié),是圖像的幾何變換的手法之一。一般圖像的旋轉是圖像的位置變換,但旋轉后,圖像的大小一般會改變。在圖像旋轉變換中,既可以把轉出顯示區(qū)域的圖像截去,也可以擴大圖像范圍以顯示所用的圖像。
opencv提供的getRotationMatrix2D函數來實現圖像旋轉,用來計算出旋轉矩陣。
Mat getRotationMatrix2D(Point2f center, double angle, double scale) center 旋轉中心點 angle 旋轉的角度 scale 圖像縮放因子
計算出旋轉矩陣后,還需要把旋轉應用到仿射變換的輸出,仿射變換函數是warpAffine
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar()); src 輸入 dst 輸出 M 變換矩陣 Size 尺寸 flags 插值算法標識符 borderMode 邊界像素模式 borderValue 邊界取值
int main() { Mat img1; img1 = imread("貓1.jpg"); imshow("原圖", img1); Point center(img1.cols / 2, img1.rows / 2); Mat m = getRotationMatrix2D(center, 30, 0.5); Mat img2; warpAffine(img1, img2, m, img1.size()); imshow("旋轉", img2); waitKey(0); }
效果如下:
圖像比例縮放是值將給定的圖像在x軸方向按比例縮放fx倍,在y軸方向按比例縮放fy倍
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR); src 輸入 dst 輸出 dsize 尺寸 fx 在x軸縮放比例 fy 在y軸縮放比例 interpolation 插值方式
int main() { Mat img1; img1 = imread("貓1.jpg"); imshow("原圖", img1); Mat img2; resize(img1, img2, Size(img1.cols / 2, img1.rows / 2)); imshow("縮小", img2); waitKey(0); }
效果如下:
int main() { Mat img1; img1 = imread("貓1.jpg"); imshow("原圖", img1); Mat img2; resize(img1, img2, Size(img1.cols * 2, img1.rows * 2)); imshow("放大", img2); waitKey(0); }
效果如下:
讀到這里,這篇“C++ opencv圖像處理怎么實現圖片幾何變換”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。