在OpenCV中,图像缩放是指改变图像的尺寸大小。通过缩放图像,可以调整图像的大小以适应不同的需求和应用场景。同时,图像缩放也可以用于图像处理中的预处理步骤,如图像增强、目标检测和图像识别等。
仿射变换矩阵是一种在几何中使用的矩阵,它能够表示仿射变换。仿射变换是一种保持直线和平行线的变换,但不一定保持距离和角度。它包括平移、旋转、缩放和错切等操作。

在二维空间中,仿射变换矩阵通常是一个3x3的矩阵,形式如下:

其中,a,b,c,d 表示线性变换(如旋转、缩放和剪切),tx ,ty表示平移。
仿射变换(Affine Transformation)是一种在几何中通过线性变换和平移来改变向量空间的变换方法。在OpenCV中,仿射变换广泛应用于图像处理、计算机视觉等领域,主要用于图像校正、对象识别和增强现实等场景。
仿射变换是指在二维或三维空间中,通过线性变换和平移来改变对象的位置和形状,保持原有对象的直线性和平移性。具体来说,仿射变换包括以下几种基本操作:
以下是OpenCV通过仿射矩阵变换实现图像缩放的案例。
import cv2
import numpy as np
# 读取图像
img = cv2.imread('./images/jpg/small_bird01.jpg')
# 定义源点和目标点
# 这里源点是图像中的三个不共线的点的坐标
# 目标点是这些点在缩放后的新坐标
src_points = np.float32([[0, 0], [img.shape[1] - 1, 0], [0, img.shape[0] - 1]])
# 假设我们想将图像缩小到原来的一半
dst_points = np.float32([[0, 0], [img.shape[1] / 2 - 1, 0], [0, img.shape[0] / 2 - 1]])
# 计算仿射矩阵
affine_matrix = cv2.getAffineTransform(src_points, dst_points)
print("仿射矩阵:",affine_matrix)
# 应用仿射变换
affine_transformed_img = cv2.warpAffine(img, affine_matrix, (img.shape[1], img.shape[0]))
print("宽度:",affine_transformed_img.shape[1])
print("高度:",affine_transformed_img.shape[0])
affine_transformed_img = affine_transformed_img[0:int(affine_transformed_img.shape[0]/2),0:int(affine_transformed_img.shape[1]/2)]
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Affine Transformed Image', affine_transformed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在OpenCV中,你可以使用cv2.resize()函数来调整图像的大小,也就是对图像进行缩放。这个函数非常灵活,允许你根据需要调整图像的宽度和高度。
函数: resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None): - src:输入的图片; - dsize:缩放的目标尺寸大小; - dst:输出图片; - fx:x轴的缩放因子; - fy:y轴的缩放因子; - interpolation:插值算法;
插值算法: (1)INTER_NEAREST:邻近插值算法,速度快,效果差; (2)INTER_LINEAR:双线性插值(使用周围的四个像素作为参考); (3)INTER_CURBIC:三次插值(使用周围的十六个像素作为参考); (4)INTER_AREA:效果最好;
代码实例:
import cv2
# 读取图像
image = cv2.imread('./images/jpg/small_bird01.jpg')
# 调整图像大小
# 参数1: 原始图像
# 参数2: 目标图像的宽度和高度 (width, height)
# 参数3: interpolation方法,常用的有cv2.INTER_LINEAR, cv2.INTER_AREA等
resized_image1 = cv2.resize(image, (200, 300), interpolation=cv2.INTER_LINEAR)
resized_image2 = cv2.resize(image, None,fx=0.6,fy=0.6, interpolation=cv2.INTER_LINEAR)
cv2.imshow('Resized Image1', resized_image1)
cv2.imshow('Resized Image2', resized_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
