opencv(12)---图像几何变换

图像缩放—resize()

函数原型

这里写图片描述

src: 输入图像,Mat类型即可
dst: 输出图像,当其非0时,由dsize确定尺寸
dsize: Size类型,指定输出图像大小,如果它等于0,由下式计算:
dsize = Size(round(fx*src.cols), round(fy*src.rows))
fx: 沿水平方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.width/src.cols
fy: 沿垂直方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.height/src.rows
interpolation: 用于指定插值方式,默认为INTER_LINEAR(线性插值)

插值方式

InterPolation

使用方式

方式一
指定dstImage.size()

ex1
Mat dstImg = Mat::zeros(512, 512, CV_8UC3);
Mat srcImg = imread(“1.jpg”);
Resize(srcImg, dstImg, dstImg.size());

方式二
不指定dstImage.size(),直接使用缩放系数

Mat dstImg ;
Mat srcImg = imread(“1.jpg”);
Resize(srcImg, dstImg, Size(), 0.5, 0.5);

头文件

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;

代码

resize(img,dstImage,Size(300,300));

图像平移

图像平移,信息丢失

原理
这里写图片描述

代码

/*图像平移*/
Mat imgTranslate(Mat& srcImg,int xOffset,int yOffset){
    int rows=srcImg.rows;
    int cols=srcImg.cols;
    Mat dstImg=Mat::zeros(srcImg.size(),srcImg.type());
    for(int i=0;i<rows;i++){
        for(int j=0;j<cols;j++){
            int x=i+yOffset;
            int y=j+xOffset;
            if(x>=0 && y>=0 && x<rows && y<cols){
                dstImg.at<Vec3b>(x,y)=srcImg.at<Vec3b>(i,j);
            }
        }
    }
    return dstImg;
}

运行结果

srcImage
这里写图片描述
dstImage
这里写图片描述

图像平移,信息不丢失

原理
这里写图片描述
代码

Mat imgTranslate1(Mat& srcImg,int xOffset,int yOffset){
int rows=srcImg.rows+yOffset;
int cols=srcImg.cols+xOffset;
Mat dstImg=Mat::zeros(rows,cols,srcImg.type());
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
   int x=i+yOffset;
   int y=j+xOffset;
   if(x>=0 && y>=0 && x<rows && y<cols)
       dstImg.at<Vec3b>(x,y)=srcImg.at<Vec3b>(i,j);

}
}
return dstImg;
}

运行结果

图像旋转

基本概念

OpenCV没有提供直接旋转图像的函数
图像旋转可能会造成图像信息丢失
图像旋转可以用仿射变换来实现

方式一

使用函数

CV_EXPORTS_W Mat getRotationMatrix2D( Point2f center, double angle, double scale );
CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst,
                         InputArray M, Size dsize,
                         int flags = INTER_LINEAR,
                         int borderMode = BORDER_CONSTANT,
                         const Scalar& borderValue = Scalar());

代码

Mat srcImg=imread("D:\\1\\1.png");
Mat dstImage;

//Point2f的两个参数,第一个为x,第二个为y
Point2f center=Point2f(srcImg.cols/2,srcImg.rows/2);
double angle=30;
double scale=0.5;
Mat roateM;
roateM=getRotationMatrix2D(center,angle,scale);//获得旋转矩阵
warpAffine(srcImg,dstImage,roateM,Size(1000,800));

运行结果

这里写图片描述

这里写图片描述

方式二 transpose()

代码

transpose(srcImg,dstImage);//将行和列进行颠倒

运行结果

这里写图片描述

这里写图片描述

方式三 flip()

函数原型

CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode);

flipCode = 0, 垂直翻转(沿X轴翻转);
flipCode > 0, 水平翻转(沿Y轴翻转);
flipCode < 0, 水平垂直翻转(180°中心对称

作用
可以实现转置和镜像变换,以及90°,180°旋转

代码

 flip(srcImg,dstImage,0);

运行结果
这里写图片描述

这里写图片描述

重映射—remap()

基本概念

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

g(x, y) = T(f(x, y))

函数原型

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

代码

Mat srcImg=imread("D:\\1\\1.png");
Mat dstImage;
int rows=srcImg.rows;
int cols=srcImg.cols;
Mat xMapImg=Mat::zeros(srcImg.size(),CV_32FC1);//map1
Mat yMapImg=Mat::zeros(srcImg.size(),CV_32FC1);//map2
for(int i=0;i<rows;i++){
   for(int j=0;j<cols;j++){
       xMapImg.at<float>(i,j)=j;//保持列不变
       //yMapImg.at<float>(i,j)=i+sin(j/10.0);//行发生改变
       yMapImg.at<float>(i,j)=rows-i;
   }
}
remap(srcImg,dstImage,xMapImg,yMapImg,CV_INTER_LINEAR);
imshow("img",srcImg);
imshow("dstImage",dstImage);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值