双线性/双三次插值是否在每个颜色通道上独立运行?

时间:2018-06-21 23:44:18

标签: python scipy interpolation bicubic bilinear-interpolation

我正在使用scipy.ndimage.interpolation.zoom进行双线性插值或双三次插值(如果我是对的,则为1或3)。

https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.ndimage.interpolation.zoom.html

在处理RGB图像时,双线性/双三次插值算法是在每个颜色通道上独立运行还是在颜色通道之间存在一定的依存关系?

1 个答案:

答案 0 :(得分:1)

ndimage.interpolation.zoom没有RGB通道的概念;它缩放任意n维数组,而每个维没有任何特殊含义。例如,如果您将图像存储为形状为(20, 20, 3)的数组,那么在zoom(image, 2)之后它将变成形状为(40, 40, 6)的数组,这当然是不希望的。

大概您将使用zoom(image, (2, 2, 1))在两个维度上进行2倍缩放,而在通道维度中不进行“缩放”。如果是这样,则通道之间没有溢出。读取NI_ZoomShift的C代码后,我发现使用get_spline_interpolation_weights可以实现缩放,该{<3>}执行一维样条插值(非双线性或双三次)。这意味着缩放将包括:

  1. 遍历每个1D切片image[:, c, ch]并通过1D插值对其进行缩放(切片之间没有交互)。
  2. 遍历每个1D切片image[r, :, ch]并通过1D插值对其进行缩放。
  3. 遍历每个1D切片image[r, c, :]并通过1D插值对其进行缩放-缩放因子为1时,值将保持相同,直至机器精度。

上述测试:缩放整个图像与分别缩放每个通道。

import numpy as np
from scipy.ndimage.interpolation import zoom
image = np.random.uniform(size=(20, 20, 3))
output = zoom(image, (2, 2, 1))
for k in range(3):
    output_channel = zoom(image[:, :, k], 2)
    print(np.max(np.abs(output_channel - output[:, :, k])))

打印值大约为1e-15,即直到浮点错误为止,输出都是相同的。