2017-01-12 8 views
0

Я сталкиваюсь с необъяснимым поведением при использовании функции cv2.remap в Opencv. Я сделал функцию, которая переводит координату y каждого пикселя вверх на число, которое отличается на каждой x-координате. Число вычисляется в соответствии с лежащей в основе кривой, которая начинается с x = 0 и заканчивается на x = 640 (для изображения 360 x 640)Неожиданное поведение при использовании OpenCV-переназначения в Python

Около недели назад я разместил вопрос on the same subject, но с другой проблемой - верх часть изображения была обрезана. На это был дан ответ, и я понял, что проблема заключается в том, что несколько пикселей от исходного изображения были сопоставлены с теми же позициями в новом изображении, и поэтому пиксели, которые сначала были отображены на верхние части, были перезаписаны другими из нижних частей.

Однако проблема, с которой я сейчас сталкиваюсь, немного отличается, поэтому я разместил новый вопрос. В этом случае проблема в том, что, поскольку я поднимаю все y-координаты вверх, я ожидаю, что нижняя часть изображения будет пустым. Это достигается с помощью приведенной ниже части кода

original = cv2.imread('C:\\Users\\User\\Desktop\\alaskan-landscaps3.jpg') 

     y_size,x_size=original.shape[:2] 
     map_x = np.zeros(original.shape[:2], np.float32) 
     map_y = np.zeros(original.shape[:2], np.float32) 
for i in range(0, y_size): 
    for j in range(0,x_size): 
     map_y[i][j]=i+yvalues[j] 
     map_x[i][j] = j 

, где yvalues[j] является у-координата кривой в точке х-координаты у. Конечно, при печати у-отображений для первых 10 строк массива map_y при х = 383 наималейшего номер 199,102

for j in range(0, 360): 
    print('At x=383,y=' + str(j) + ' mapping of y-coordinate is:' + str(map_y[j][383])) 

At x=383,y=0 mapping of y-coordinate is:199.102 
At x=383,y=1 mapping of y-coordinate is:200.102 
At x=383,y=2 mapping of y-coordinate is:201.102 
At x=383,y=3 mapping of y-coordinate is:202.102 
At x=383,y=4 mapping of y-coordinate is:203.102 
At x=383,y=5 mapping of y-coordinate is:204.102 
At x=383,y=6 mapping of y-coordinate is:205.102 

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

At x=383,y=0mapping is:199.102 
At x=383,y=1mapping is:199.102 
At x=383,y=2mapping is:199.102 
At x=383,y=3mapping is:199.102 
At x=383,y=4mapping is:199.102 
At x=383,y=5mapping is:200.102 
At x=383,y=6mapping is:200.102 
At x=383,y=7mapping is:200.102 
At x=383,y=8mapping is:200.102 
At x=383,y=9mapping is:201.102 
At x=383,y=10mapping is:201.102 

Однако на этот раз, то изображение не будет полностью заполнено, и нет пустое место в нижней части. Вы можете видеть оба изображения ниже:

enter image description here

(некачественно эффект не то, что я предполагал, но это для меня, чтобы исправить :)). Я проверил все записи конкретного столбца в массиве map_y для x = 383, и все значения> 199.102, поэтому, похоже, это не та же проблема, что и в предыдущем случае, т. Е. В столбце нет пикселей выше нанесенный на нижнюю часть.

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

Извинения за длинный пост, но я пытался выяснить причину для нескольких дней и не вышло ни одного мудрее. Любая помощь будет оценена.

ответ

1

Я думаю, вы неправильно поняли, как работает функция переназначения(). Позвольте мне привести цитату из документации OpenCV для функции initUndistortRectifyMap():

«Функция фактически строит карты для алгоритма обратного отображения, который используется функцией переназначения(). То есть для каждого пикселя (u, v) в целевом изображении функция вычисляет соответствующие координаты в исходном изображении ».

Так что ваша линия

At x=383,y=0mapping is:199.102 

на самом деле означает, что значение пикселя (383, 0) в преобразованном изображении взято из пикселя (383, 199.102) в исходном изображении.

Пиксель не отображается, если: а) значение map_x [I] [J] или map_y [I] [J] -1 (-16 в случае короткого типа карты) или б) значение находится за пределами исходного изображения.

+0

Вы правы, я неправильно понял, как работает функция сопоставления. Теперь мне удалось преобразовать изображение, как ожидалось. Спасибо! – Socrats