2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【学习OpenCV4】图像变换方法总结(放缩 翻转 旋转)

【学习OpenCV4】图像变换方法总结(放缩 翻转 旋转)

时间:2023-02-25 16:59:17

相关推荐

【学习OpenCV4】图像变换方法总结(放缩 翻转 旋转)

图像变换方法

一、图像放缩Resize二、图像翻转flip三、图像旋转warpAffine

一、图像放缩Resize

1.1 基本知识

图像放缩用到了许多插值方法,常见的差值算法有线性插值、立方差值、双立方差值、采样放缩算法等等。

所使用的API为resize(),函数的定义如下

void resize(InputArray src,//输入图像OutputArray dst,//输出图像Size dsize,//输出尺寸double fx=0,//水平缩放比例double fy=0,//垂直缩放比例int interpolation=INTER_LINEAR//插值方式)

其中dsize为0时,fx和fy均不可为零;fx和fy为0时,输出图像按dsize输出interpolation内插方式有以下四种: CV_INTER_NEAREST最邻近插值点法CV_INTER_LINEAR 双线性插值法CV_INTER_AREA邻域像素再取样插补CV_INTER_CUBIC   双立方插补,4*4大小的补点

1.2 示例程序

void MyDemo::resize_Demo(Mat& image) {Mat zoomin, zoomout;//定义输出图像int h = image.rows;//获取原图像的宽高int w = image.cols;resize(image, zoomin, Size(w * 1.5, h * 1.5), 0, 0, INTER_LINEAR);//图像放大1.5倍imshow("zoomin", zoomin);resize(image, zoomout, Size(w / 2, h / 2), 0, 0, INTER_LINEAR);//图像缩小2倍imshow("zoomout", zoomout);}

二、图像翻转flip

图像反转就是将图像左右或上下反转镜像。所用到的函数是flip(),函数的定义如下。

void cv::flip(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像int flipCode = 0// >0: 沿y轴翻转, 0: 沿x轴翻转, <0: x、y轴同时翻转);

测试程序如下:

void MyDemo::flip_Demo(Mat& image) {Mat dst;flip(image, dst, 0);//上下翻转imshow("上下翻转", dst);flip(image, dst, 1);//左右翻转imshow("左右翻转", dst);flip(image, dst, -1);//对角线翻转(180°旋转)imshow("对角线翻转(180°旋转)", dst);}

三、图像旋转warpAffine

void cv::warpAffine (InputArray src,//输入图像OutputArray dst,//输出图像InputArray M,//变换矩阵Sizedsize,//输出图像大小intflags = INTER_LINEAR,//插值方式int borderMode = BORDER_CONSTANT,//图像边缘像素模式const Scalar&borderValue = Scalar()//边界填充值

其中M变换矩阵可以通过如下函数获得,旋转矩阵的形式如下:

M=cv2.getRotationMatrix2D(center, angle, scale)

由于旋转之后,图像的大小会发生变化,因此需要重新计算图像的长宽,计算方法可以参考下图:

图像旋转的示例程序如下:

void MyDemo::rotate_Demo(Mat& image) {Mat dst, M;int h = image.rows;int w = image.cols;M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);//定义变换矩阵Mdouble cos = abs(M.at<double>(0, 0));//求cos值double sin = abs(M.at<double>(0, 1));//求sin值int nw = cos * w + sin * h;//计算新的长、宽int nh = sin * w + cos * h;M.at<double>(0, 2) += (nw / 2 - w / 2);//计算新的中心M.at<double>(1, 2) += (nh / 2 - h / 2);warpAffine(image, dst, M, Size(nw,nh), INTER_LINEAR,0,Scalar(255,255,255));imshow("Rotation", dst);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。