目录
一、前言
在计算机视觉、图像处理以及深度学习领域,经常需要对图片进行尺寸调整。
例如:
图片压缩
缩略图生成
目标检测
图像增强
神经网络输入预处理
假设有一张图片:
1920 × 1080
而模型要求输入:
640 × 640
此时就需要进行:
图像缩放(Image Scaling)
很多人认为:
缩放图片
只是改变宽高
实际上在数学层面,图像缩放的本质是:
利用缩放矩阵(Scaling Matrix)重新计算每个像素的坐标位置。
二、图像是如何表示的
在计算机中:
图片本质上是一个矩阵。
例如:
5 × 5 图像
可以表示为:
[
10 20 30 40 50
15 25 35 45 55
20 30 40 50 60
25 35 45 55 65
30 40 50 60 70
]
其中:
每个元素
表示一个像素值
而每个像素都对应一个坐标:
(x, y)
例如:
左上角
(0,0)
右下角
(4,4)
三、什么是图像缩放
假设原始图片大小:
100 × 100
目标尺寸:
200 × 200
那么:
图片被放大2倍
反之:
200 × 200
↓
100 × 100
则属于:
图片缩小
无论放大还是缩小,本质都是:
重新计算像素坐标
四、缩放矩阵是什么
二维空间中的缩放矩阵:
[
Sx 0
0 Sy
]
其中:
Sx
X方向缩放比例
Sy
Y方向缩放比例
例如:
放大2倍:
[
2 0
0 2
]
横向放大2倍:
纵向放大3倍:
[
2 0
0 3
]
五、缩放矩阵如何作用于坐标
假设一个像素坐标:
P
=
[
10
20
]
表示:
x = 10
y = 20
缩放矩阵:
[
2 0
0 2
]
计算:
[
2 0
0 2
]
×
[
10
20
]
结果:
[
20
40
]
说明:
原坐标
(10,20)
↓
新坐标
(20,40)
图片放大了2倍。
六、为什么需要矩阵运算
如果图片有:
1920 × 1080
像素数量:
2073600
超过200万个像素。
如果逐个手工计算:
效率极低
因此:
矩阵乘法
成为图像变换的核心工具。
七、图像缩放流程

八、放大示例
假设原图坐标:
(1,1)
(2,2)
(3,3)
缩放矩阵:
[
2 0
0 2
]
计算后:
| 原坐标 | 新坐标 |
|---|---|
| (1,1) | (2,2) |
| (2,2) | (4,4) |
| (3,3) | (6,6) |
可以看到:
所有坐标扩大2倍
九、缩小示例
缩放矩阵:
[
0.5 0
0 0.5
]
原坐标:
(100,60)
计算:
[
0.5 0
0 0.5
]
×
[
100
60
]
结果:
[
50
30
]
说明:
图片缩小一半
十、使用NumPy模拟缩放矩阵
python
import numpy as np
point = np.array([
[10],
[20]
])
scale_matrix = np.array([
[2,0],
[0,2]
])
new_point = scale_matrix @ point
print(new_point)
输出:
[[20]
[40]]
十一、批量处理多个像素
多个坐标:
python
import numpy as np
points = np.array([
[1,2],
[2,3],
[3,4]
])
scale = 2
scaled_points = points * scale
print(scaled_points)
输出:
[
[2 4]
[4 6]
[6 8]
]
十二、OpenCV实现图像缩放
安装:
pip install opencv-python
读取图片:
python
import cv2
img = cv2.imread("test.jpg")
print(img.shape)
输出:
(1080,1920,3)
表示:
高1080
宽1920
RGB三通道
缩放图片:
python
import cv2
img = cv2.imread("test.jpg")
resized = cv2.resize(
img,
(640,640)
)
cv2.imwrite(
"result.jpg",
resized
)
生成:
640 × 640
新图片。
十三、按照比例缩放
例如:
缩小50%
代码:
python
import cv2
img = cv2.imread("test.jpg")
resized = cv2.resize(
img,
None,
fx=0.5,
fy=0.5
)
cv2.imwrite(
"small.jpg",
resized
)
其中:
fx
横向缩放比例
fy
纵向缩放比例
十四、为什么会出现锯齿
理论上:
坐标变换后
可能出现小数坐标
例如:
(10,20)
↓
(15.5,30.5)
但是:
像素位置必须是整数
因此需要:
插值算法
计算像素值。
常见插值方法:
最近邻插值
Nearest Neighbor
速度最快。
双线性插值
Bilinear
最常用。
双三次插值
Bicubic
效果更平滑。
十五、OpenCV指定插值方式
双线性插值:
python
resized = cv2.resize(
img,
(640,640),
interpolation=cv2.INTER_LINEAR
)
双三次插值:
python
resized = cv2.resize(
img,
(640,640),
interpolation=cv2.INTER_CUBIC
)
十六、深度学习中的应用
在训练神经网络时:
通常需要统一输入尺寸。
例如:
YOLO
640 × 640
ResNet
224 × 224
ViT
224 × 224
因此:
缩放矩阵
是计算机视觉最基础的变换之一
几乎所有视觉模型都会使用。
十七、缩放矩阵与仿射变换
图像缩放实际上属于:
仿射变换
的一种。
常见仿射变换包括:
缩放
旋转
平移
镜像
错切
其中:
缩放矩阵
负责改变大小
旋转矩阵
负责改变方向
十八、总结
图像缩放看似简单,但背后涉及线性代数中的矩阵变换思想。
核心公式:
新坐标
=
缩放矩阵
×
原坐标
缩放矩阵:
[
Sx 0
0 Sy
]
其中:
Sx
横向缩放比例
Sy
纵向缩放比例
在实际项目中:
图像压缩
目标检测
图像分类
深度学习预处理
都离不开缩放矩阵。
可以这样理解:
图像缩放
不是简单改变图片大小
而是在数学上
重新计算每一个像素的位置
而缩放矩阵,正是完成这一过程的核心工具。