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

news/2024/7/8 6:15:18 标签: opencv, 计算机视觉, 人工智能

目录

opencv%20%E5%9B%BE%E5%83%8F%E7%9A%84%E7%BC%A9%E6%94%BE(%E6%94%BE%E5%A4%A7%EF%BC%8C%E7%BC%A9%E5%B0%8F)%EF%BC%8C%E7%BF%BB%E8%BD%AC%EF%BC%8C%E6%97%8B%E8%BD%AC1%E3%80%81%E5%9B%BE%E5%83%8F%E7%9A%84%E7%BC%A9%E6%94%BE%EF%BC%8C%E6%97%8B%E8%BD%AC%E8%BF%87%E7%A8%8B%E4%B8%AD%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E6%8F%92%E5%80%BC%EF%BC%9A2%E3%80%81%E5%B8%B8%E8%A7%81%E7%9A%84%E6%8F%92%E5%80%BC%E7%AE%97%E6%B3%95%E5%8C%85%E6%8B%AC%EF%BC%9A3%E3%80%81%E5%9B%BE%E5%83%8F%E7%9A%84%E7%BC%A9%E6%94%BE%EF%BC%8C%E7%BF%BB%E8%BD%AC%EF%BC%8C%E6%97%8B%E8%BD%AC%EF%BC%9A%EF%BC%881%EF%BC%89%E5%9B%BE%E5%83%8F%E7%9A%84%E7%BC%A9%E6%94%BE%20cv2%3A%3Aresize()%EF%BC%8C%E7%94%A8%E4%BA%8E%E6%94%B9%E5%8F%98%E5%9B%BE%E5%83%8F%E5%A4%A7%E5%B0%8F%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%8C%E5%AE%83%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%BA%8E%E5%9B%BE%E5%83%8F%E7%9A%84%E6%94%BE%E5%A4%A7%E3%80%81%E7%BC%A9%E5%B0%8F%E6%93%8D%E4%BD%9C%EF%BC%9A%E5%87%BD%E6%95%B0%E5%8E%9F%E5%9E%8B%EF%BC%9A%E7%A4%BA%E4%BE%8B%EF%BC%9A%E5%B0%86%E4%B8%80%E4%B8%AA%E5%9B%BE%E5%83%8F%E7%BC%A9%E5%B0%8F%E4%B8%BA%E5%8E%9F%E6%9D%A5%E7%9A%84%E4%B8%80%E5%8D%8A%EF%BC%882%EF%BC%89%E5%9B%BE%E5%83%8F%E7%9A%84%E7%BF%BB%E8%BD%AC%20cv2%3A%3Aflip()%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%AE%9E%E7%8E%B0%E5%9B%BE%E5%83%8F%E7%BF%BB%E8%BD%AC%EF%BC%88%E9%95%9C%E5%83%8F%EF%BC%89%E6%93%8D%E4%BD%9C%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%8C%E5%AE%83%E5%8F%AF%E4%BB%A5%E5%9C%A8%E6%B0%B4%E5%B9%B3%E6%96%B9%E5%90%91%E3%80%81%E5%9E%82%E7%9B%B4%E6%96%B9%E5%90%91%E6%88%96%E8%80%85%E5%90%8C%E6%97%B6%E5%9C%A8%E4%B8%A4%E4%B8%AA%E6%96%B9%E5%90%91%E4%B8%8A%E8%BF%9B%E8%A1%8C%E7%BF%BB%E8%BD%AC%EF%BC%9A%E5%87%BD%E6%95%B0%E5%8E%9F%E5%9E%8B%EF%BC%9A%E7%A4%BA%E4%BE%8B%EF%BC%9A%E5%B0%86%E4%B8%80%E4%B8%AA%E5%9B%BE%E5%83%8F%E6%B2%BF%E6%B0%B4%E5%B9%B3%E6%96%B9%E5%90%91%E8%BF%9B%E8%A1%8C%E7%BF%BB%E8%BD%AC%EF%BC%883%EF%BC%89%E5%9B%BE%E5%83%8F%E7%9A%84%E6%97%8B%E8%BD%AC%20cv2%3A%3AwarpAffine()%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%AE%9E%E7%8E%B0%E5%9B%BE%E5%83%8F%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%88%E5%9B%BE%E5%83%8F%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2%E6%98%AF%E6%8C%87%E5%AF%B9%E5%9B%BE%E5%83%8F%E8%BF%9B%E8%A1%8C%E5%B9%B3%E7%A7%BB%E3%80%81%E6%97%8B%E8%BD%AC%E3%80%81%E7%BC%A9%E6%94%BE%E3%80%81%E7%BF%BB%E8%BD%AC%E7%AD%89%E5%87%A0%E4%BD%95%E5%8F%98%E6%8D%A2%E7%9A%84%E6%93%8D%E4%BD%9C%EF%BC%89%E5%87%BD%E6%95%B0%E5%8E%9F%E5%9E%8B%EF%BC%9A%E7%A4%BA%E4%BE%8B%EF%BC%9A%E5%B0%86%E4%B8%80%E4%B8%AA%E5%9B%BE%E5%83%8F%E6%8C%89%E7%85%A7%E6%8C%87%E5%AE%9A%E8%A7%92%E5%BA%A6%E8%BF%9B%E8%A1%8C%E6%97%8B%E8%BD%AC%E4%B8%8A%E9%9D%A2%E4%BE%8B%E5%AD%90%E6%97%8B%E8%BD%AC%E5%90%8E%E5%9B%BE%E5%83%8F%E5%B9%B6%E4%B8%8D%E8%83%BD%E4%BF%9D%E8%AF%81%E5%AE%8C%E5%85%A8%E5%8F%AF%E8%A7%81%EF%BC%8C%E8%BF%98%E9%9C%80%E8%A6%81%E8%AE%A1%E7%AE%97%E6%97%8B%E8%BD%AC%E5%90%8E%E5%9B%BE%E5%83%8F%E7%9A%84%E5%AE%BD%E5%BA%A6%E5%92%8C%E9%AB%98%E5%BA%A6%EF%BC%8C%E4%BB%A5%E5%8F%8A%E6%97%8B%E8%BD%AC%E5%90%8E%E4%B8%AD%E5%BF%83%E7%82%B9%E5%9D%90%E6%A0%87%E3%80%82-toc" style="background-color:transparent;margin-left:160px;">opencv 图像的缩放(放大,缩小),翻转,旋转1、图像的缩放,旋转过程中为什么需要插值:2、常见的插值算法包括:3、图像的缩放,翻转,旋转:(1)图像的缩放 cv2::resize(),用于改变图像大小的函数,它可以用于图像的放大、缩小操作:函数原型:示例:将一个图像缩小为原来的一半(2)图像的翻转 cv2::flip(),用于实现图像翻转(镜像)操作的函数,它可以在水平方向、垂直方向或者同时在两个方向上进行翻转:函数原型:示例:将一个图像沿水平方向进行翻转(3)图像的旋转 cv2::warpAffine(),用于实现图像仿射变换的函数(图像仿射变换是指对图像进行平移、旋转、缩放、翻转等几何变换的操作)函数原型:示例:将一个图像按照指定角度进行旋转上面例子旋转后图像并不能保证完全可见,还需要计算旋转后图像的宽度和高度,以及旋转后中心点坐标。


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

1、图像的缩放,旋转过程中为什么需要插值:
通过使用适当的插值方法,可以确保图像在变换过程中保持合理的视觉品质和准确性;

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

(2)保持图像连续性: 插值算法可以保持图像在变换过程中的连续性和平滑性,避免出现锯齿状的边缘或形变;

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;
}


http://www.niftyadmin.cn/n/5536639.html

相关文章

R 绘图 - 饼图

R 绘图 - 饼图 饼图是一种常用的数据可视化工具&#xff0c;用于展示数据集中各个类别的相对比例。在R语言中&#xff0c;饼图可以通过多种方式绘制&#xff0c;其中最常用的是pie()函数。本文将详细介绍如何在R中创建和定制饼图&#xff0c;包括基本饼图的绘制、添加标签、调…

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

Spring:Spring中分布式事务解决方案

一、前言 在Spring中&#xff0c;分布式事务是指涉及多个数据库或系统的事务处理&#xff0c;其中事务的参与者、支持事务的服务器、资源管理器以及事务管理器位于分布式系统的不同节点上。这样的架构使得两个或多个网络计算机上的数据能够被访问并更新&#xff0c;同时将这些操…

adb shell ps -T打印出来参数的含义,以及D,T,Z代表的状态含义是什么?

在Android系统中&#xff0c;使用adb shell ps命令可以查看当前系统中运行的进程信息。当你添加-T选项时&#xff08;注意&#xff0c;标准的ps命令在Android的adb shell中可能不直接支持-T选项&#xff0c;这通常与Linux中的ps命令略有不同&#xff09;&#xff0c;你可能是想…

Docker容器 为MySQL创建新用户和授权

当您需要为 MySQL 数据库创建一个新用户并配置其访问权限时&#xff0c;可以按照以下步骤操作。我将创建一个名为 newuser 的新用户&#xff0c;并为其授予在任何主机上访问所有数据库的权限。 创建新用户和授权步骤&#xff1a; 登录到 MySQL 服务器 首先&#xff0c;使用具有…

UE5的安装与基本操作(一)

文章目录 前言安装UE5新建第一个游戏项目基本游览方式对目标进行变换各种变换对齐 快速定位目标 总结 前言 Unreal Engine 5 (UE5) 是一款由 Epic Games 开发的实时 3D 创作平台&#xff0c;用于制作游戏、电影、动画、建筑可视化和其他类型的交互式体验。UE5 提供了一系列强大…

打印详细讲解

DATA: lv_func_module_name TYPE rs38l_fnam, "打印程序函数名lv_sformname TYPE tdsfname, "smartforms名称ls_control_parameters TYPE ssfctrlop,ls_output TYPE ssfcompop,ls_job_output_info TYPE ssfcrescl,ls_ssfcrespd T…

昇思学习打卡-5-基于Mindspore实现BERT对话情绪识别

本章节学习一个基本实践–基于Mindspore实现BERT对话情绪识别 自然语言处理任务的应用很广泛&#xff0c;如预训练语言模型例如问答、自然语言推理、命名实体识别与文本分类、搜索引擎优化、机器翻译、语音识别与合成、情感分析、聊天机器人与虚拟助手、文本摘要与生成、信息抽…