Работает ли билинейная / бикубическая интерполяция на каждом цветовом канале независимо?

Я использую scipy.ndimage.interpolation.zoom с билинейной или бикубической интерполяцией (порядок =1 или 3, если я прав).

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

При работе с RGB-изображением работают ли алгоритмы билинейной / бикубической интерполяции независимо для каждого цветового канала или есть какая-то зависимость между цветовыми каналами?

1 ответ

Решение

ndimage.interpolation.zoom не имеет понятия каналов RGB; он увеличивает произвольный n-мерный массив без какого-либо особого значения для каждого измерения. Например, если у вас есть изображение, сохраненное в виде массива формы (20, 20, 3) затем после zoom(image, 2) это станет массивом формы (40, 40, 6) что, конечно, нежелательно.

Предположительно вы будете использовать zoom(image, (2, 2, 1)) иметь 2-кратное увеличение в обоих измерениях и отсутствие "увеличения" в измерении канала. Если так, то между каналами не будет никакого побочного эффекта. Чтение С кода NI_ZoomShift Я вижу, что увеличение достигается с помощью get_spline_interpolation_weights который выполняет одномерную сплайн-интерполяцию (не билинейную или бикубическую). Это означает, что масштаб будет состоять из:

  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, т. Е. Выходные данные одинаковы до ошибок с плавающей запятой.

Другие вопросы по тегам