Как изменить размер изображения, но сохранить значения пикселей в sk-image? - PullRequest
2 голосов
/ 25 января 2020

Я хочу изменить размер изображения. Мои изображения содержат определенные c значения [0, 1, 2, 7, 9]. После изменения размера вводятся новые значения, такие как 5 и еще много чего. Я хочу предотвратить это.

В настоящее время я использую scikit функцию изменения размера изображения. Я перепробовал все флаги интерполяции, но безрезультатно.

РЕДАКТИРОВАТЬ: простой код, чтобы показать проблему

import numpy as np
from skimage.transform import resize
vals = [0, 1, 4, 6]
N, M = 100, 100
image = np.random.choice(vals, N * M).reshape(N, M).astype('uint8')
resized_image = resize(image, (50, 50), preserve_range=True).astype('uint8')

print('vals before resizing ', np.unique(image))
print('vals after resizing ', np.unique(resized_image))

Ответы [ 3 ]

2 голосов
/ 25 января 2020

Установите anti_aliasing на False:

resized_image = resize(image, (50, 50), order=0, preserve_range=True, anti_aliasing=False).astype('uint8')

anti_aliasingbool, необязательно
Применять ли фильтр Гаусса для сглаживания изображения перед уменьшением масштаба. Очень важно фильтровать при понижающей дискретизации изображения, чтобы избежать артефактов сглаживания.

Фильтр сглаживания применяет фильтр Гаусса, который генерирует новые значения.


Результат:

vals before resizing  [0 1 4 6]
vals after resizing  [0 1 4 6]
1 голос
/ 25 января 2020

Вы не хотите сглаживания, но функция изменения размера будет применять его по умолчанию (так что функция будет применять ядро ​​Гаусса к изображению, чтобы избавиться от алиасинга), поэтому, если вы хотите сохранить оригинальные пиксели, вы должны отключить этот флаг на anti_aliasing=False

resized_image = resize(image, (50, 50), preserve_range=True, anti_aliasing=False,order=0).astype('uint8')

При этом изменении вывод будет:

vals before resizing  [0 1 4 6]
vals after resizing  [0 1 4 6]

Изучив документацию по функциям изменения размера, мы увидим, что ядро ​​Гаусса будет применяться только тогда, когда изображение с измененным размером меньше исходного. (в вашем случае)

anti_aliasingbool, необязательно

Применять ли фильтр Гаусса для сглаживания изображения перед уменьшением масштаба. Крайне важно фильтровать при понижающей дискретизации изображения, чтобы избежать наложения артефактов.

1 голос
/ 25 января 2020

Если вы хотите избежать ввода новых значений, вам нужно избегать линейной, билинейной, квадратичной c и других "вычисленных" типов интерполяции и использовать интерполяцию NEAREST_NEIGHBOUR. Это особенно важно для палитр (то есть индексированных) изображений и классификационных изображений, где каждое число представляет класс, что может означать, что интерполяция между классом, который представляет, скажем, «лес», и смежным классом, который представляет «шоссе», внезапно вводит некоторое новое значение между этими двумя значениями означает, что вы построили пляж в Аризоне!

Это означает, что используйте order=0 (соответствует «ближайший сосед» ) вместо значения по умолчанию order=1 (соответствует до «билинейный» ) при изменении размера.

Различные типы интерполяции изложены здесь .

...