• 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 }
  • 相关阅读:
    [转]oracle 12c 中的分页子句
    display:table; 也可以实现 div 始终和内包的图片大小相同
    mongodb与SQL常见语句对照
    js生成验证码
    javascript 判断空数组
    网络绘制插件
    mongodb中查询返回指定字段
    Mybatis获取插入记录的自增长ID
    mysql 创建索引和删除索引
    Java 中 HashMap 初始化时赋值
  • 原文地址:https://www.cnblogs.com/Long-w/p/9663095.html
Copyright © 2020-2023  润新知