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

1

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

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

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

Теги:
scipy
interpolation
bicubic

1 ответ

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

Печатные значения составляют около 1е-15, т.е. Результат совпадает с ошибками с плавающей запятой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню