让我们学习如何使用OpenCV调整图像大小。要调整图像的大小,请根据指定的比例因素或设置所需的高度和宽度,沿着每个轴(高度和宽度)缩放图像。
当调整图像大小:

  • 如果你想在调整后的图像中保持相同的大小,重要的是要记住图像的原始宽高比(即宽度与高度的比率)。
  • 减小图像的大小需要对像素进行重新采样。
  • 增加图像的大小需要重建图像。这意味着你需要插入新的像素。

1.简单版本代码实现

为了完成这些操作,需要使用各种插值技术。在OpenCV中有几种方法可用,选择哪种插值方法通常取决于特定的应用程序。
让我们看看通过自定义高度和宽度来调整图像大小的代码示例。随着你继续,我们将讨论使用不同的比例因素和插值方法来调整图像大小。
(1)Python

# 导入相关库
import cv2
import numpy as np

# 读取图片
image = cv2.imread('image.jpg')
cv2.imshow('Original Image', image)

# 让我们使用新的宽度和高度缩小图像
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)

# 让我们使用新的宽度和高度来增加图像尺寸
up_width = 600
up_height = 400
up_points = (up_width, up_height)
resized_up = cv2.resize(image, up_points, interpolation= cv2.INTER_LINEAR)

# 显示图像
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()

(2)C++

// including库
#include<opencv2/opencv.hpp>
#include<iostream>

// 命名空间
using namespace std;
using namespace cv;

int main()
{
	// 读取图像
	Mat image = imread("image.jpg");
	imshow("Original Image", image);


	// 让我们使用新的宽度和高度缩小图像
	int down_width = 300;
	int down_height = 200;
	Mat resized_down;
	//resize down
	resize(image, resized_down, Size(down_width, down_height), INTER_LINEAR);
	// 让我们使用新的宽度和高度增加图像尺寸
	int up_width = 600;
	int up_height = 400;
	Mat resized_up;
	//调节图像尺寸
	resize(image, resized_up, Size(up_width, up_height), INTER_LINEAR);
	// 显示图像并按任意键继续
	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;
}

2.代码解析

注意,在c++代码片段中,您首先为图像创建了一个矩阵,然后使用imread()函数读取它。
在开始调整图像大小之前,要知道它的原始大小。获取图像的大小:

  • 使用Python中的shape方法
  • c++中的rows和cols

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

  • 1)调整函数的语法
    我们将在下面的小节中讨论各种输入参数选项,resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

    • src:输入图像,它可以是带有输入图像路径的字符串(例如:’ test_image.png ')。
    • dsize:调整大小后的图像的大小
    • fx:沿水平轴的比例因子。
    • fy:垂直轴上的比例因子。
    • interpolation:它让我们可以选择不同的方法来调整图像的大小。
  • 2)通过指定宽度和高度来调整大小
    在第一个例子中,让我们通过指定一个新的宽度和高度来调整图像的大小。在下面的代码中:

    • 我们将所需的宽度设置为300,所需的高度设置为200。
    • 这两个值组合在一个2D向量中,这是resize()函数所要求的。
    • 我们还指定了插值方法,它恰好是默认值。

(1)Python

# 设置行和列数 
# 让我们缩小图像使用新的宽度和高度
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resize_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)

(2)C++

// 设置行和列数  
// 让我们缩小图像使用新的宽度和高度
int down_width = 300;
int down_height = 200;
Mat resize_down;

// 降采样
resize(image, resize_down, Size(down_width, down_height), INTER_LINEAR);

根据我们定义的新的高度和宽度参数,图像要么变大,要么变小。但需要注意的是,这种通过定义一个显式的宽度和高度值来调整大小的做法会使结果图像失真。也就是说,图像的宽高比不会保持不变。

  • 3)使用缩放因子调整大小
    现在我们用缩放因子来调整图像的大小。但在进一步讨论之前,您需要了解什么是比例因子。
    缩放因子通常是乘以某个数字,在我们的例子中是图像的宽度和高度。它有助于保持长宽比完好无损,并保持显示质量。所以当你放大或缩小图像时,图像不会显得扭曲。
    (1)Python
# 通过指定两个缩放因子,将图像放大1.2倍
scale_up_x = 1.2
scale_up_y = 1.2
# 将图像缩小0.6倍,指定单个比例因子。
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)

(2)C++

// 通过指定两个缩放因子,将图像放大1.2倍
double scale_up_x = 1.2;
double scale_up_y = 1.2;
// 将图像缩小0.6倍,指定单个比例因子。
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代码片段中:
a. 我们沿着水平和垂直轴定义新的比例因子。
b. 定义缩放因子可以消除对缩放后图像的宽度和高度的需求。因此,我们保持dsize为None。
在上面的c++代码片段中:
a. 我们为新图像定义了新的比例因子。
b. 定义缩放因子可以消除对缩放后图像的宽度和高度的需求,所以我们将Size()保持为空。

  • 4)用不同的插值方法调整大小
    不同的插值方法用于不同的尺寸调整目的。
    • INTER_AREA:INTER_AREA使用像素面积关系进行重采样。这最适合于缩小图像的大小。当用于放大图像时,它使用INTER_NEAREST方法。
    • INTER_CUBIC:使用双三次插值来调整图像的大小。在调整大小和插值新像素时,该方法对图像的4×4邻近像素起作用。然后取16个像素的加权平均值来创建新的插值像素。
    • INTER_LINEAR:这种方法有点类似于INTER_CUBIC插值。但与INTER_CUBIC不同的是,它使用2×2相邻像素来获得插值像素的加权平均值。
    • INTER_NEAREST:INTER_NEAREST方法使用最近邻概念进行插值。这是最简单的方法之一,只使用图像的一个相邻像素进行插值。

(1)Python

# 使用不同的插值方法缩小图像0.6倍
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)

# 在水平轴连接图像以进行比较
vertical= np.concatenate((res_inter_nearest, res_inter_linear, res_inter_area), axis = 0)
# 显示图像按任意键继续
cv2.imshow('Inter Nearest :: Inter Linear :: Inter Area', vertical)

(2)C++

// 使用不同的插值方法缩小图像0.6倍
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);

Mat a,b,c;
vconcat(res_inter_linear, res_inter_nearest, a);
vconcat(res_inter_area, res_inter_area, b);
vconcat(a, b, c);
// 显示图像按任意键继续
imshow("Inter Linear :: Inter Nearest :: Inter Area :: Inter Area", c);

在上面的Python代码片段中,我们使用不同的插值方法来调整图像的大小。类似地,在c++代码片段中,我们首先为输出图像定义新的矩阵,然后使用不同的插值方法调整它们的大小。

总结

您学习了如何使用自定义的高度和宽度来调整图像的大小。您还看到了如何使用缩放因子保持长宽比不变,确保调整大小的图像看起来不失真。我们还讨论了不同类型的插值方法。

参考目录

https://learnopencv.com/image-resizing-with-opencv/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐