bash run.sh数学上,图像通常被视为一个 连续函数:
其中
-
$(x,y)$ :连续坐标 -
$C$ :通道数(1 或 3) -
$f(x,y)$ 的“大小”并不是以像素数度量的 - 它代表了同一个真实连续图像
在数学上,图像本身不存在“分辨率”的概念,只存在定义域大小。
当你把连续图像转换成数字图像时,你是对 (f(x,y)) 进行 离散采样:
不同分辨率代表不同采样密度。
-
$W,H$ are pixel counts. -
$L_x, L_y$ are physical lengths
- 如果放大图片的物理长度但是像素点的个数保持不变,分辨率会随着物理尺寸的增大而下降。
- 因此,在保证分辨率不变的基本情形下,需要使用插值算法增加像素点的个数。
具体而言,图片缩放可以看成:
- 图像的物理尺寸从
$(L_x, L_y)$ 变成了$(L_x^{'},L_y^{'})$ - 图像的数字特征为从一个离散网格
$(W_0, H_0)$ 采样恢复/推测原始连续函数$f(x,y)$ ,然后在新的网格上重新取样$(W_1, H_1)$ 。
在这个过程中,需要保证分辨率不变:
每个维度之间相互独立 对于图片的缩小,不需要计算额外的插值节点,但是需要做下采样
我们需要实现一个自定义的图像缩放类,这个图像缩放类需要实现下面的功能:
- 读入一张本地图片,解析成张量格式
- 利用自主实现的若干插值算法(最近邻插值/双线性插值/双二次插值/双三次插值)
- 具体来说,对于每张图像,可以被解析成一个
$(H, W, C)$ 的三维高阶张量(不考虑并行 batch 运算) - 对每一个通道分别做插值, Input:
$(H_i, W_i)$ 。 - 因此,对于我们设计的插值积累,需要实现的一个接口是:
- 具体来说,对于每张图像,可以被解析成一个
def scale(self, input_tensor, output_size):
# input_tensor is a 2-D tensor which shape is $(H, W)$
# output size is a tuple demonstrating the output size, which shape is $(H', W')$
...
return output_tensor- 输入:二维数组 (
$I \in \mathbb{R}^{H\times W}$ ) - 输出:二维数组 (
$I' \in \mathbb{R}^{H'\times W'}$ )
- OpenCV 读取一张图片,并且确定放大后图片的尺寸
- 计算得到目标张量的 size
- 调用 Scale 函数实现
- 本地导出图片
- 并且和原始的图片的直接拉伸进行比较