OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)

简介: OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)

使用OpenCV调整图像大小。要调整图像的大小,可以根据每个轴(高度和宽度)进行缩放,考虑指定的缩放因素,或者只需设置所需的高度和宽度。


调整图像大小时:


如果想在调整后的图像中保持相同的宽高比,请务必记住图像的原始宽高比(即宽度和高度)。

缩小图像的大小需要重新采样像素。

增加图像的大小需要重建图像。这意味着需要插值新像素。

各种插值技术发挥作用来完成这些操作。OpenCV中有几种方法可供选择,选择通常取决于特定的应用程序。


通过调整自定义高度和宽度的大小来使图像越来越小。随着您的进一步发展,我们将讨论使用不同的比例因子和插值方法调整大小。


1.图像尺寸信息


Python


# let's start with the Imports 
import cv2
import numpy as np
# Read the image using imread function
image = cv2.imread('image.jpg')
cv2.imshow('Original Image', image)
# let's downscale the image using new  width and height
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)
# let's upscale the image using new  width and height
up_width = 600
up_height = 400
up_points = (up_width, up_height)
resized_up = cv2.resize(image, up_points, interpolation= cv2.INTER_LINEAR)
# Display images
cv2.imshow('Resized Down by defining height and width', resized_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining height and width', resized_up)
cv2.waitKey()
#press any key to close the windows
cv2.destroyAllWindows()


C++


// let's start with including libraries 
#include<opencv2/opencv.hpp>
#include<iostream>
// Namespace to nullify use of cv::function(); syntax
using namespace std;
using namespace cv;
int main()
{
  // Read the image using imread function
  Mat image = imread("image.jpg");
  imshow("Original Image", image);
  // let's downscale the image using new  width and height
  int down_width = 300;
  int down_height = 200;
  Mat resized_down;
  //resize down
  resize(image, resized_down, Size(down_width, down_height), INTER_LINEAR);
  // let's upscale the image using new  width and height
  int up_width = 600;
  int up_height = 400;
  Mat resized_up;
  //resize up
  resize(image, resized_up, Size(up_width, up_height), INTER_LINEAR);
  // Display Images and press any key to continue
  imshow("Resized Down by defining height and width", resized_down);
  waitKey();
  imshow("Resized Up image by defining height and width", resized_up);
  waitKey();
  destroyAllWindows();
  return 0;
}


在开始调整图像的大小之前,先了解其原始尺寸。要获取图像的大小:


  • 在Python中使用shape方法
  • C++中的rows和cols参数

Python中的image.shape返回三个值:高度、宽度和通道数。

在C++中:


image.rows:图像的高度

image.columns:图像的宽度

也可以使用size()函数获得上述结果。


image.size().width 返回宽度

image.size().height 返回高度


Python


# Get original height and width
h,w,c = image.shape
print("Original Height and Width:", h,"x", w)


C++


// Get height and width
cout << "Original Height and Width :" << image.rows << "x" << image.cols << endl;


这里需要注意的一件重要事情是,OpenCV以h e i g h t ∗ w i d t h ∗ c h a n n e l s height*width*channelsheight∗width∗channels格式输出图像的形状,而其他一些图像处理库则以宽度、高度的形式输出。对此有合乎逻辑的看法。


当使用OpenCV读取图像时,它们表示为NumPy数组。一般来说,总是用r o w s ∗ c o l u m n s rows*columnsrows∗columns(表示其高度的行和表示其宽度的列)来引用数组的形状。因此,即使使用OpenCV读取图像以获得其形状,相同的NumPy数组规则也会发挥作用。你得到形状的形状是h e i g h t ∗ w i d t h ∗ c h a n n e l s height*width*channelsheight∗width∗channels。


OpenCV resize()函数语法


OpenCV resize()函数语法需要两个输入参数:


源图像。

调整大小图像的所需大小,d大小。

我们将在以下各节中讨论各种输入参数选项。


resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

src:这是必需的输入图像,它可以是具有输入图像路径的字符串(例如:“test_image.png”)。

dsize:它是输出图像的理想尺寸,它可以是新的高度和宽度。

fx:沿水平轴的缩放因子。

fy:沿垂直轴的缩放因子。

interpolation:它为我们提供了调整图像大小的不同方法的选择。


2.使用自定义宽度和高度调整图像大小


在第一个示例中,让我们通过指定一个新的宽度和高度来调整图像的大小,这将缩小图像的缩放。在以下代码中:


我们将所需的宽度设置为300,所需的高度设置为200。

这两个值组合成一个二维向量,这是resize()函数所要求的。

我们还指定了插值方法,恰好是默认值。


Python


# Set rows and columns 
# lets downsize the image using new  width and height
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)


C++


// Set rows and columns 
// lets downsize the image using new width and height
   int down_width = 300;
   int down_height = 200;
   Mat resize_down;
   // resize down
   resize(image, resize_down, Size(down_width, down_height), INTER_LINEAR);


接下来,我们创建另一个变量来增加图像的大小。


Python


# Set rows and columns
up_width = 600
up_height = 400
up_points = (up_width, up_height)
# resize the image
resized_up = cv2.resize(image, up_points, interpolation = cv2.INTER_LINEAR)


C++


// Set rows and columns
int up_width = 600;
int up_height = 400;
Mat resized_up;
//resize up
resize(image, resized_up, Size(up_width, up_height), INTER_LINEAR);


在上面的Python代码中,我们正在使用resize()函数定义新的宽度和高度来升级图像。过程和步骤与之前的片段相似。


在C++代码中:


我们定义了用于升级的宽度和高度的新整数。

给出输出图像的矩阵。

然后使用resize()函数,与之前的代码相同。

现在,让我们使用OpenCV的imshow()函数显示所有图像。


Python


# Display images
cv2.imshow('Resized Down by defining height and width', resized_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining height and width', resized_up)
cv2.waitKey()
cv2.destroyAllWindows()


C++


// Display Images and press any key to continue
imshow("Resized Down by defining height and width", resized_down);
waitKey();
imshow("Resized Up image by defining height and width", resized_up);
waitKey();
destroyAllWindows();


3.使用缩放因子调整图像的大小


现在我们用缩放因子调整图像的大小。但在更进一步之前,你需要了解什么是缩放因素。


缩放因子通常是尺度缩放或乘以某些数量的数字,在图像中尺寸是图像的宽度和高度。缩放因子有助于保持宽高比完好无损,并保持显示质量。因此,在您升级或缩小缩放图像时,图像不会显得失真。


Python


# Scaling Up the image 1.2 times by specifying both scaling factors
scale_up_x = 1.2
scale_up_y = 1.2
# Scaling Down the image 0.6 times specifying a single scale factor.
scale_down = 0.6
scaled_f_down = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
scaled_f_up = cv2.resize(image, None, fx= scale_up_x, fy= scale_up_y, interpolation= cv2.INTER_LINEAR)


C++


// Scaling Up the image 1.2 times by specifying both scaling factors
double scale_up_x = 1.2;
double scale_up_y = 1.2;
// Scaling Down the image 0.6 times specifying a single scale factor.
double scale_down = 0.6;
Mat scaled_f_up, scaled_f_down;
//resize 
resize(image,scaled_f_down, Size(), scale_down, scale_down, INTER_LINEAR);
resize(image, scaled_f_up, Size(), scale_up_x, scale_up_y, INTER_LINEAR);


在上面的Python代码中:


我们沿着水平和垂直轴定义了新的缩放因素。

定义缩放因子,就不需要对增加新的图像宽度和高度。因此,值为None。

在上面的C++代码中:


我们定义了新的缩放因子以及新图像的矩阵。

由于我们不需要新的宽度和高度点,我们保持Size()为空,并使用resize()函数

现在,让我们展示图像,以便可视化和更好地理解。


Python


# Display images and press any key to check next image
cv2.imshow('Resized Down by defining scaling factor', scaled_f_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining scaling factor', scaled_f_up)
cv2.waitKey()


C++


// Display images and Press any key to continue check next image
imshow("Resized Down by defining scaling factor", scaled_f_down);
waitKey();
imshow("Resized Up by defining scaling factor", scaled_f_up);
waitKey();


4.使用不同的插值方法调整大小


不同的插值方法用于调整不同的尺寸大小。


INTER_AREA:INTER_AREA使用像素区域关系进行重新采样。这最适合缩小图像的大小(缩小)。当用于放大图像时,它使用INTER_NEAREST方法。

INTER_CUBIC:这使用双立方插值来调整图像的大小。在调整新像素的大小和插值时,此方法作用于图像的4×4相邻像素。然后,需要16像素的平均权重来创建新的插值像素

INTER_LINEAR:此方法与INTER_CUBIC插值有点相似。但与INTER_CUBIC不同,这使用2×2相邻像素来获得插值像素的加权平均值。

INTER_NEAREST:INTER_NEAREST方法使用最近的邻居概念进行插值。这是最简单的方法之一,仅使用图像中的一个相邻像素进行插值。

如果您不完全理解插值方法,请不要担心。我们将在一个单独的例子中解释它们。


Python


# Scaling Down the image 0.6 times using different Interpolation Method
res_inter_nearest = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_NEAREST)
res_inter_linear = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
res_inter_area = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_AREA)


C++


# Scaling Down the image 0.6 using different Interpolation Method
Mat res_inter_linear, res_inter_nearest, res_inter_area;
resize(image, res_inter_linear, Size(), scale_down, scale_down, INTER_LINEAR);
resize(image, res_inter_nearest, Size(), scale_down, scale_down, INTER_NEAREST);
resize(image, res_inter_area, Size(), scale_down, scale_down, INTER_AREA);


在上面的Python片段中,我们正在使用不同的插值方法调整图像的大小。同样,在C++片段中,我们首先为输出图像定义新矩阵,然后使用不同的插值方法调整它们的大小。现在让我们显示图像。


Python


# Concatenate images in horizontal axis for comparison
vertical= np.concatenate((res_inter_nearest, res_inter_linear, res_inter_area), axis = 0)
# Display the image Press any key to continue
cv2.imshow('Inter Nearest :: Inter Linear :: Inter Area', vertical)


C++


Mat a,b,c;
vconcat(res_inter_linear, res_inter_nearest, a);
vconcat(res_inter_area, res_inter_area, b);
vconcat(a, b, c);
// Display the image Press any key to continue
imshow("Inter Linear :: Inter Nearest :: Inter Area :: Inter Area", c);
相关文章
|
2天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
2天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
2天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
2天前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
2天前
|
知识图谱 Python
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80
|
24天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
52 14