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

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

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

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


person David Parks    schedule 21.06.2018    source источник


Ответы (1)


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

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

  1. Просмотр каждого одномерного среза image[:, c, ch] и масштабирование его с помощью одномерной интерполяции (без взаимодействия между срезами).
  2. Просмотр каждого одномерного среза image[r, :, ch] и его масштабирование с помощью одномерной интерполяции.
  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, т. е. вывод одинаков вплоть до ошибок с плавающей запятой.

person Community    schedule 22.06.2018