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