Я использую scipy.ndimage.interpolation.zoom
с билинейной интерполяцией или бикубической интерполяцией (порядок = 1 или 3, если я прав).
https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.ndimage.interpolation.zoom.html
При работе с RGB-изображением билинейные/бикубические интерполяционные алгоритмы работают независимо на каждом цветовом канале или есть зависимость между цветовыми каналами?
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
который выполняет одномерную сплайн-интерполяцию (не билинейную или бикубическую). Это означает, что зум будет состоять из:
image[:, c, ch]
1D slice image[:, c, ch]
и масштабирование его с помощью интерполяции 1D (без взаимодействия между срезами).image[r, :, ch]
1D slice image[r, :, ch]
и масштабирование его с помощью интерполяции 1D.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, т.е. Результат совпадает с ошибками с плавающей запятой.