opencv學習之路(11)、圖像幾何變換


一、圖像縮放

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Mat dst;
 7     resize(src,dst,Size(300,300));
 8     imshow("src",src);
 9     imshow("dst",dst);
10     waitKey(0);
11 }

二、圖像平移

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 
 4 //不改變圖像大小
 5 Mat imgTranslate(Mat &src,int x_off,int y_off){//x方向偏移,y方向偏移
 6     int rows=src.rows;//
 7     int cols=src.cols;//
 8     Mat dst=Mat::zeros(src.size(),src.type());//創建一個全黑圖像
 9     for (int i = 0; i < rows; i++)//遍歷行
10     {
11         for (int j = 0; j < cols; j++)//遍歷列
12         {
13 
14             int x=j+x_off;//列坐標+x方向偏移=當前x坐標
15             int y=i+y_off;
16             if(x>=0&&y>=0&&x<cols&&y<rows){
17                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);//賦值,(y,x)對應(i,j),詳情見下面圖示
18             }
19         }
20     }
21     return dst;
22 }
23 //改變圖像大小
24 Mat imgTranslate2(Mat &src,int x_off,int y_off){
25     int rows=src.rows+y_off;
26     int cols=src.cols+x_off;
27     Mat dst=Mat::zeros(rows,cols,src.type());//注意與上面的差別,行列重新選值
28     for (int i = 0; i < rows; i++)
29     {
30         for (int j = 0; j < cols; j++)
31         {
32 
33             int x=j+x_off;
34             int y=i+y_off;
35             if(x>=0&&y>=0&&x<cols&&y<rows){
36                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);
37             }
38         }
39     }
40     return dst;
41 }
42 
43 void main(){
44     Mat src=imread("E://0.jpg");
45     //Mat dst=imgTranslate(src,20,30);
46     Mat dst=imgTranslate2(src,-20,-30);
47     imshow("src",src);
48     imshow("dst",dst);
49     waitKey(0);
50 }

三、圖像旋轉

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Point2f center=Point2f(src.cols/2,src.rows/2);//旋轉中心
 7     double angle=15;//旋轉角度
 8     double scale=0.5;//縮放尺度
 9     Mat rotate=getRotationMatrix2D(center,angle,scale);//旋轉矩陣
10     Mat dst;
11     warpAffine(src,dst,rotate,Size(600,400));//仿射變換
12 
13     imshow("src",src);
14     imshow("dst",dst);
15     waitKey(0);
16 }

四、轉置和鏡像

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 
 4 void main(){
 5     Mat src=imread("E://1.jpg");
 6     Mat dst;
 7     //transpose(src,dst);//先左右翻轉,然后再逆時針旋轉90°
 8     //flip(src,dst,0);//沿x軸翻轉
 9     //flip(src,dst,1);//大於0,沿y軸翻轉
10     flip(src,dst,-1);//小於0,沿原點翻轉
11 
12     imshow("src",src);
13     imshow("dst",dst);
14     waitKey(0);
15 }
transpose效果如下:

flipCode = 0, 垂直翻轉(沿X軸翻轉),效果如下:

 

flipCode > 0, 水平翻轉(沿Y軸翻轉),效果如下:

flipCode < 0, 水平垂直翻轉(180°中心對稱),效果如下:

五、重映射remap

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3 
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Mat dst;
 7 
 8     int rows=src.rows;
 9     int cols=src.cols;
10     Mat xMap=Mat::zeros(src.size(),CV_32FC1);//map1
11     Mat yMap=Mat::zeros(src.size(),CV_32FC1);//map2
12 
13     for (int i = 0; i < rows; i++)
14     {
15         for (int j = 0; j < cols; j++)
16         {
17             xMap.at<float>(i,j)=j;//保持列不變
18             //yMap.at<float>(i,j)=i+5*sin(j/10.0);//sin水波效果
19             yMap.at<float>(i,j)=rows-i;//上下翻轉
20         }
21     }
22     remap(src,dst,xMap,yMap,CV_INTER_LINEAR);
23 
24     imshow("src",src);
25     imshow("dst",dst);
26     waitKey(0);
27 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM