zoukankan      html  css  js  c++  java
  • 10、【opencv入门】图像的几何变换

    一、图像缩放

    【示例】

     1 //图像的缩放
     2 #include<opencv2/opencv.hpp>
     3 
     4 using namespace cv;
     5 
     6 int main(){
     7     Mat src=imread("1.jpg");
     8     Mat dst;
     9     resize(src,dst,Size(300,300));
    10     imshow("src",src);
    11     imshow("dst",dst);
    12     waitKey(0);
    13     return 0;
    14 }

    二、图像平移

    图像的平移有两种情况:

    1、平移后的图像大小不变,信息丢失

    【示例】

     1 //图像平移,大小不变,信息丢失
     2 #include<opencv2/opencv.hpp>
     3 
     4 using namespace cv;
     5 
     6 //不改变图像大小
     7 Mat imgTranslate(Mat &src,int x_off,int y_off){//x方向偏移,y方向偏移
     8     int rows=src.rows;//
     9     int cols=src.cols;//
    10     Mat dst=Mat::zeros(src.size(),src.type());//创建一个全黑图像
    11     for (int i = 0; i < rows; i++)//遍历行
    12     {
    13         for (int j = 0; j < cols; j++)//遍历列
    14         {
    15 
    16             int x=j+x_off;//列坐标+x方向偏移=当前x坐标
    17             int y=i+y_off;
    18             if(x>=0&&y>=0&&x<cols&&y<rows){
    19                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);//赋值,(y,x)对应(i,j),详情见下面图示
    20             }
    21         }
    22     }
    23     return dst;
    24 }
    25 
    26 int main(){
    27     Mat src=imread("1.jpg");
    28     Mat dst=imgTranslate(src,20,30);
    29 
    30     imshow("src",src);
    31     imshow("dst",dst);
    32     waitKey(0);
    33     return 0;
    34 }

    2、平移后的图像大小改变,信息完整

    【示例】

     1 //图像平移,改变大小,信息完整
     2 #include<opencv2/opencv.hpp>
     3 
     4 using namespace cv;
     5 //改变图像大小
     6 Mat imgTranslate(Mat &src,int x_off,int y_off){
     7     int rows=src.rows+y_off;
     8     int cols=src.cols+x_off;
     9     Mat dst=Mat::zeros(rows,cols,src.type());//注意与上面的差别,行列重新选值
    10     for (int i = 0; i < rows; i++)
    11     {
    12         for (int j = 0; j < cols; j++)
    13         {
    14 
    15             int x=j+x_off;
    16             int y=i+y_off;
    17             if(x>=0&&y>=0&&x<cols&&y<rows){
    18                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);
    19             }
    20         }
    21     }
    22     return dst;
    23 }
    24 
    25 int main(){
    26     Mat src=imread("1.jpg");
    27     Mat dst=imgTranslate(src,20,30);
    28 
    29     imshow("src",src);
    30     imshow("dst",dst);
    31     waitKey(0);
    32     return 0;
    33 }

    三、图像旋转

    【示例】

     1 //图像旋转
     2 #include<opencv2/opencv.hpp>
     3 
     4 using namespace cv;
     5 
     6 int main(){
     7     Mat src=imread("1.jpg");
     8     Point2f center=Point2f(src.cols/2,src.rows/2);//旋转中心
     9     double angle=45;//旋转角度
    10     double scale=0.5;//缩放尺度
    11     Mat rotate=getRotationMatrix2D(center,angle,scale);//旋转矩阵
    12     Mat dst;
    13     warpAffine(src,dst,rotate,Size(600,400));//仿射变换
    14 
    15     imshow("src",src);
    16     imshow("dst",dst);
    17     waitKey(0);
    18     return 0;
    19 }

    四、转置和镜像

    【示例】

     1 //图像的转置和镜像
     2 #include<opencv2/opencv.hpp>
     3 using namespace cv;
     4 
     5 int main(){
     6     Mat src=imread("1.jpg");
     7     Mat dst;
     8     //transpose(src,dst);//先左右翻转,然后再逆时针旋转90°
     9     //flip(src,dst,0);//沿x轴翻转
    10     //flip(src,dst,1);//大于0,沿y轴翻转
    11     flip(src,dst,-1);//小于0,沿原点翻转
    12 
    13     imshow("src",src);
    14     imshow("dst",dst);
    15     waitKey(0);
    16     return 0;
    17 }

    五、重映射remap

    remap()函数:重映射是指把图像中的一个位置的像素通过映射关系转换到另一个图像的指定位置。对于输出原图像f(x, y),目标图像g(x, y),映射关系为T,则满足下式:

    g(x, y) = T(f(x, y))
    1 CV_EXPORTS_W void remap(InputArray src, OutputArray dst,
    2                             InputArray map1, InputArray map2,
    3                             int interpolation, int borderMode = BORDER_CONSTANT,
    4                             const Scalar& borderValue=Scalar());
    1 map1:表示(x, y)点的坐标或x坐标,CV_16SC2, CV_32FC1, CV_32FC2类型
    2 map2:表示(x, y)点的y坐标,如果map1为(x,y),map2可以选择不用,可以是CV_16UC1, CV32FC1
    3 interpolation:表示插值方法
    4 borderMode:表示边界插值类型
    5 borderValue:表示插值数值

    【示例】

     1 //重映射
     2 #include<opencv2/opencv.hpp>
     3 using namespace cv;
     4 
     5 int main(){
     6     Mat src=imread("1.jpg");
     7     Mat dst;
     8 
     9     int rows=src.rows;
    10     int cols=src.cols;
    11     Mat xMap=Mat::zeros(src.size(),CV_32FC1);//map1
    12     Mat yMap=Mat::zeros(src.size(),CV_32FC1);//map2
    13 
    14     for (int i = 0; i < rows; i++)
    15     {
    16         for (int j = 0; j < cols; j++)
    17         {
    18             xMap.at<float>(i,j)=j;//保持列不变
    19             yMap.at<float>(i,j)=i+5*sin(j/10.0);//sin水波效果
    20             //yMap.at<float>(i,j)=rows-i;//上下翻转
    21         }
    22     }
    23     remap(src,dst,xMap,yMap,CV_INTER_LINEAR);
    24 
    25     imshow("src",src);
    26     imshow("dst",dst);
    27     waitKey(0);
    28     return 0;
    29 }
  • 相关阅读:
    web应用/http协议/web框架
    算法-排序-1.冒泡排序/2.选择排序/3.插入排序
    算法-基础和查找-1.汉诺塔/2.顺序查找/3.二分查找/4.顺序查找和二分查找的比较
    前端开发
    前端开发
    前端开发
    前端开发
    数据库
    LeetCode : Add Binary
    LeetCode : Length of Last Word
  • 原文地址:https://www.cnblogs.com/Long-w/p/9663095.html
Copyright © 2011-2022 走看看