opencv 图像的缩放(放大,缩小),翻转,旋转

这篇具有很好参考价值的文章主要介绍了opencv 图像的缩放(放大,缩小),翻转,旋转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv 图像的缩放(放大,缩小),翻转,旋转

opencv 最常用的图像缩放方法是使用 cv2::resize() 函数,它需要指定输出图像的大小,和插值算法;

opencv 最常用的图像翻转方法是使用 cv::flip() 函数,它需要指定图像翻转方式;

opencv 最常用的图像旋转方法是使用 cv::warpAffine() 函数,它需要指定输出图像的大小,和插值算法;

1、图像的缩放,旋转过程中为什么需要插值:

通过使用适当的插值方法,可以确保图像在变换过程中保持合理的视觉品质和准确性;

(1)非整数坐标位置: 在进行缩放、翻转、旋转等变换时,新位置的坐标通常是浮点数,不一定是整数。例如,对于一个2倍放大的操作,像素的坐标会变成原来的两倍,如1.5、3.7等。但图像只能在整数坐标位置获取像素值;

(2)保持图像连续性: 插值算法可以保持图像在变换过程中的连续性和平滑性,避免出现锯齿状的边缘或形变;文章来源地址https://www.toymoban.com/news/detail-728805.html

2、常见的插值算法包括:
  • 最近邻插值(cv2::INTER_NEAREST): 选择距离变换位置最近的一个像素的值作为新位置的像素值;
  • 双线性插值(cv2::INTER_LINEAR): 使用相邻四个像素的加权平均值来估计新位置的像素值;
  • 双三次插值(cv2::INTER_CUBIC): 使用相邻16个像素的加权平均值来估计新位置的像素值;
3、图像的缩放,翻转,旋转:
(1)图像的缩放 cv2::resize(),用于改变图像大小的函数,它可以用于图像的放大、缩小操作:
函数原型:
void cv::resize(
    InputArray src,
    OutputArray dst,
    Size dsize,
    double fx = 0, 
    double fy = 0,
    int interpolation = INTER_LINEAR
);

参数解释:
src:输入图像;
dst:输出图像;
dsize:输出图像的大小,通常使用cv::Size()来指定; 
fx:沿水平轴的缩放因子,如果设置为0,则通过 fy 来确定缩放比例; 
fy:沿垂直轴的缩放因子,如果设置为0,则通过 fx 来确定缩放比例; 
interpolation:插值算法(
	INTER_NEAREST
	INTER_LINEAR	默认
        INTER_CUBIC	适合放大操作
); 

示例:将一个图像缩小为原来的一半
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	//读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\suzy4.jpg");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}

	imshow("src", src);

	// 通过指定缩放因子,将图像缩小为原来的一半
	cv::Mat amplify1, amplify2, reduce1, reduce2;
	cv::resize(src, amplify1, cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);
	cv::imshow("amplify1", amplify1);

	// 通过指定输出图像的尺寸,将图像缩小为原来的一半
	int w = src.cols;
	int h = src.rows;
	cv::resize(src, amplify2, cv::Size(w/2, h/2), 0, 0, cv::INTER_LINEAR);
	cv::imshow("amplify2", amplify2);

	// 通过指定缩放因子,将图像放大为原来的1.5倍
	cv::resize(src, reduce1, cv::Size(), 1.5, 1.5, cv::INTER_LINEAR);
	cv::imshow("reduce1", reduce1);

	// 通过指定输出图像的尺寸,将图像放大为原来的1.5倍
	cv::resize(src, reduce2, cv::Size(w*1.5, h*1.5), 0, 0, cv::INTER_LINEAR);
	cv::imshow("reduce2", reduce2);

	waitKey();
	destroyAllWindows();
	return 0;
}

(2)图像的翻转 cv2::flip(),用于实现图像翻转(镜像)操作的函数,它可以在水平方向、垂直方向或者同时在两个方向上进行翻转:
函数原型:
void cv::flip(
    InputArray src,   
    OutputArray dst,  
    int flipCode   
);

参数解释:
src:输入图像;
dst:输出图像;
flipCode:翻转方式(
	0	-> 沿x轴翻转(垂直翻转)(上下翻转)
	1	-> 沿y轴翻转(水平翻转)(左右翻转)
	-1	-> 同时沿x和y轴翻转(对角线翻转)
); 

示例:将一个图像沿水平方向进行翻转
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	//读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\suzy1.jpg");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}

	imshow("src", src);

	cv::Mat flipped_image;
	cv::flip(src, flipped_image, 1);    // 沿y轴翻转

	cv::imshow("Flipped Image", flipped_image);

	waitKey();
	destroyAllWindows();
	return 0;
}

(3)图像的旋转 cv2::warpAffine(),用于实现图像仿射变换的函数(图像仿射变换是指对图像进行平移、旋转、缩放、翻转等几何变换的操作)
函数原型:
void cv::warpAffine(
    InputArray src, 
    OutputArray dst, 
    InputArray M, 
    Size dsize, 
    int flags = INTER_LINEAR,
    int borderMode = BORDER_CONSTANT,
    const Scalar& borderValue = Scalar()
);

1、参数解释:
src:输入图像;
dst:输出图像;
M:仿射变换矩阵,用于定义变换关系,这里定义的是旋转矩阵,需要借助cv2.getRotationMatrix2D()函数定义图像旋转参数,函数返回一个cv::Mat类型的矩阵,其中包含了进行旋转变换的矩阵信息;
dsize:输出图像的大小,通常使用cv::Size()来指定;  
flags :插值算法(
	INTER_NEAREST
	INTER_LINEAR	默认
        INTER_CUBIC	适合放大操作
); 
borderMode:边界模式,默认为BORDER_CONSTANT常数边界模式;
borderValue:borderValue默认值等于Scalar(),表示创建一个所有通道值为0的常量颜色,

2、定义旋转矩阵:
cv::Mat cv::getRotationMatrix2D(
	cv::Point2f center, 	// 旋转的中心坐标 (x, y),类型为cv::Point2f,使用的是浮点数作为坐标
	double angle, 		// 旋转角度,以度为单位(正值表示逆时针旋转,负值表示顺时针旋转)
	double scale		// 缩放比例,可选参数,默认为1.0
);

3、注意:
const Scalar& borderValue = Scalar()表达式的含义如下:
Scalar 是OpenCV库中用于表示多通道颜色值的数据类型,可以包括1到4个通道;
borderValue 是函数的参数名,它表示用于边界填充的颜色值;
=Scalar() 表示给定参数的默认值,在这里Scalar()创建了一个所有通道值为0的标量(黑色),用于作为默认的边界填充颜色;
const修饰符,表示borderValue是一个常量引用,即在函数中不能对其进行修改;

示例:将一个图像按照指定角度进行旋转
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	//读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\suzy1.jpg");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}
	//namedWindow("src", WINDOW_NORMAL);
	imshow("src", src);

	cv::Mat rotated_image;
	// 图像src的中心点坐标
	cv::Point2f center(src.cols/2.0, src.rows/2.0);
	// 定义一个角度
	double angle = 45.0;
	// 定义了一个旋转矩阵
	cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, angle, 1.0);
	// 将图像按照定义的rotation_matrix旋转变换的矩阵信息,进行旋转
	cv::warpAffine( src, rotated_image, rotation_matrix, src.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 255) );

	cv::imshow("Rotated Image", rotated_image);

	waitKey();
	destroyAllWindows();
	return 0;
}

上面例子旋转后图像并不能保证完全可见,还需要计算旋转后图像的宽度和高度,以及旋转后中心点坐标
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	//读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\suzy1.jpg");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}
	//namedWindow("src", WINDOW_NORMAL);
	imshow("src", src);

	cv::Mat dst;
	int w = src.cols;
	int h = src.rows;
	// 图像src的中心点坐标
	cv::Point2f center(w/2.0, h/2.0);
	// 定义一个角度
	double angle = 45.0;
	// 定义了一个旋转矩阵
	cv::Mat M = cv::getRotationMatrix2D(center, angle, 1.0);
	// 下几行代码用于调整旋转后图像的位置,确保旋转后图像完全可见
	double cos = abs(M.at<double>(0, 0));
	double sin = abs(M.at<double>(0, 1)); 
	// 旋转后图像的宽度nw和高度nh
	int nw = int( abs(cos)*w + abs(sin)*h );
	int nh = int( abs(sin)*w + abs(cos)*h );
	// 旋转后图像的中心点位置
	M.at<double>(0, 2) += (nw/2 - w/2);
	M.at<double>(1, 2) += (nh/2 - h/2);
	// 由于计算出的 nw 和 nh 可能是浮点数,但 cv::warpAffine()函数的第四个参数(目标图像的大小)需要整数类型
	cv::Size newSize(nw, nh);
	// 将图像按照定义的rotation_matrix旋转变换的矩阵信息,进行旋转
	cv::warpAffine( src, dst, M, newSize, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255) );

	cv::imshow("Rotated Image", dst);

	waitKey();
	destroyAllWindows();
	return 0;
}

到了这里,关于opencv 图像的缩放(放大,缩小),翻转,旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】Bitmap图片旋转、缩放、翻转等变换(90/100)

    自定义BitmapChangeView: 工具类: 布局引用: 应用如下: 推荐理由 postman在国内使用已经越来越困难: 1、登录问题严重 2、Mock功能服务基本没法使用 3、版本更新功能已很匮乏 4、某些外力因素导致postman以后能否使用风险较大 出于以上考虑因此笔者自己开发了一款api调试开发工

    2024年02月16日
    浏览(22)
  • MATLAB【数字图像处理】 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)

    1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 Matlab 2020B 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显示RGB图像和灰度图像,注上文字标

    2024年02月06日
    浏览(31)
  • 通过opencv实现图像的旋转、缩放

    用opencv来实现图像的旋转与缩放,代码如下: #include iostream #include opencv2/opencv.hpp using namespace cv; //#include opencv.hpp /*** (1). implementing Bilinear Interpolation ***/ bool BilinearInterpolation(     IplImage* pSrcImg,   //@pSrcImg : input gray image     IplImage* pDstImg,  //@pDstImg : output scaled gray image     

    2024年02月22日
    浏览(29)
  • 【精选】使用opencv的resize函数进行等比例放大或缩小图像

    在 OpenCV 中,使用 resize() 函数可以对图像进行缩放操作。若要按比例扩大或缩小图像,可以通过指定目标大小,并结合原始图像的尺寸进行等比例扩大。 以下是一个示例代码,展示了如何在 Python 中使用 OpenCV 对图像进行等比例扩大: 这段代码首先读取原始图像,然后获取其

    2024年02月03日
    浏览(23)
  • OpenCV-18图像的翻转和旋转

    一、图像的翻转 使用API---cv.flip(src, flipCode) flipCode = 0表示上下翻转 flipCode 0表示左右翻转 flipCode 0上下 + 左右翻转 或者使用np的翻转src[: : -1,: : -1]实现上下翻转。 示例代码如下: 输出结果如下: 二、图像的旋转 使用API ---cv2.rotate(img, rotateCode) ROTATE_90_CLOCKWISE    90度顺

    2024年02月02日
    浏览(27)
  • js实现图片的放大缩小(鼠标长按拖拽、鼠标滚轮控制放大缩小)

    该功能的需求点事2个月前的一个需求,当时采用的是Element-UI中的image图片做的一个功能,但是不能满足产品真实的需求,只能定制化自己封装。 该功能在Vue2 的element-UI中还是比较鸡肋的 ⬇️ ⬇️ Element-UI 该功能在Emenent-UI-plus(vue3)版本已经很好的支持了。 完整功能如下

    2024年02月03日
    浏览(55)
  • 【C++ OpenCV】图像变换:连接、尺寸、翻转、旋转、仿射变换

    目录 图像缩放变换 图像翻转 图像拼接 纵向拼接 横向拼接 图像插值原理 作用 单线性插值 双线性插值的公式 双线性插值的例子 双线性插值的直观展示 意义 仿射变换 图像旋转 实操 一、实现图像旋转 二、根据定义的三个点实现仿射变换,并且求取仿射变换矩阵 源码 src -

    2024年01月18日
    浏览(31)
  • Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能

    前言 其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放。 效果: 注:该配图使用《漫画|有趣的了解一下赋值、深浅拷贝》文章图片,不存在侵权问题。 实现思路 在js中,onmousewheel是鼠标滑轮滚动事件,可以通过

    2024年02月01日
    浏览(37)
  • Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

    一,矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对矩阵进行分解和简化可以简化计算过程。对于

    2024年01月22日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包