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 }

原文地址:https://www.cnblogs.com/little-monkey/p/7214632.html