Изменение размера CV2 дает ошибочные результаты случайным образом при использовании с ближайшим соседом - PullRequest
0 голосов
/ 23 июня 2019

Я использую cv2.resize для изменения размера двухмерных изображений, заданных в трехмерном массиве типа «uint8», и я хочу использовать интерполяцию ближайшего соседа. Я заметил, что он дает (случайным образом) совершенно несовместимый результат (например, он будет выводить значения вне диапазона значений исходного массива).

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

import numpy as np
import cv2

shape=[512,512,80,10]
nbr_iter=100

for _ in range(nbr_iter):
    img=np.random.randint(0,2,shape,dtype=np.uint8)
    ret=np.reshape(img,(img.shape[0],img.shape[1],-1))
    ret = cv2.resize(ret, (256,256),interpolation=cv2.INTER_NEAREST)
    ret=np.reshape(ret,(ret.shape[0],ret.shape[1],img.shape[2]))
    if np.max(ret)>1:
        print("inconsistant array (value greater than 1) with value of %s"%(np.max(ret)))

При последнем запуске код выводит:

inconsistant array (value greater than 1) with value of 130
inconsistant array (value greater than 1) with value of 130
...

для всех прогонов, хотя значения исходного массива лежат в пределах [0,1], если смотреть на значения внутри:

ret[ret>1]
[ 16 130  55 130  86  85]

Я не могу иметь никакого смысла в выводе, почему там были эти случайные числа, поэтому мне было бы интересно узнать, могут ли другие люди воспроизвести это и откуда могут возникнуть эти проблемы.

1 Ответ

0 голосов
/ 23 июня 2019

np.random.randint() является правым исключением, поэтому ваша первая строка в основном np.zeros(...).

UINT8 содержит значения от 0 до 0xff (255).Как вы думаете, почему он не может быть больше 1?

...