一、圖像縮放
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 }