2016-09-16 3 views
2

У меня есть изображение F размера 1044 * 1408, он имеет только 3 целочисленные значения 0, 2, и 3.термоусадочных/изменить размер изображения без интерполяции

Я хочу, чтобы уменьшить его до 360 * 480. Теперь я использую Z= cv2.resize(F,(480,380)). Но Z интерполирован, он имеет много уникальных значений, больше, чем просто 0, 2 и 3. Я не могу просто округлить интерполированные значения до ближайшего целого числа, потому что я получу несколько единиц.

F считывается из файла tif и обрабатывается, теперь это ndarray. Поэтому я не могу использовать PIL: F = F.resize((new_width, new_height)) как F не от F = Image.open(*).

+1

То, что вы хотите, вероятно, передискретизацию изображения вместо изменения размера. Поскольку вы упоминаете 'ndarray', я предполагаю, что вы используете' numpy'. Посмотрите на решение («numpy slicing») в http://stackoverflow.com/questions/25876640/subsampling-every-nth-entry-in-a-numpy-array. Это позволит выполнять повторную выборку (подвыборку) без интерполяции. –

+0

не должен CV_INTER_NN метод «интерполяции» выбирает одно из значений исходного пикселя (тот, который имеет наименьшее расстояние до положения пикселя с измененным размером)? – Micka

+0

Да, установка 'interpolation = cv2.INTER_NEAREST' позволит вам использовать ближайшее значение пикселя. Я могу использовать 'Z = cv2.resize (F, (480,380), интерполяция = cv2.INTER_NEAREST)', чтобы получить только 0,2 и 3. Мне интересно, есть ли какой-либо метод, который вообще не делает интерполяции – Echo

ответ

2

Вы можете использовать INTER_NEAREST:

Z= cv2.resize(F,(480,380),fx=0, fy=0, interpolation = cv2.INTER_NEAREST) 
Смежные вопросы