Почему OpenCV polarWarp вносит артефакты в некоторые изображения?

#c #opencv #polar-coordinates #remap

#c #opencv #полярные координаты #переназначение

Вопрос:

У меня есть несколько небольших (обычно около 60×60 или меньше) изображений формата BGR, для которых я генерирую полярные проекции, используя warpPolar OpenCV. Большую часть времени это работает нормально, но иногда я получаю изображение (из того же источника камеры, что и изображения, которые работали нормально), в котором есть разброс артефактов. Все три разных метода интерполяции создают артефакты. Я обнаружил, что увеличение полярного радиуса устраняет артефакты, но может ли кто-нибудь объяснить, почему это может иметь значение?

Вот код, представляющий призыв к warpPolar:

 Mat m = imread( "image.png", IMREAD_COLOR);
Moments mom = moments( m);
int len = //... semi-major axis*2 for ellipse fit
warpPolar( m, polar, Size(), Point( mom.m10/mom.m00, mom.m01/mom.m00) , len, INTER_LINEAR);
 

Вот изображение, которое работает нормально:

Исходный двоичный объект # 1 —[warpPolar]—> Блоб #1 Полярная проекция

Вот изображение, которое привело к появлению радуги артефактов примерно на четверти пути вниз и полосы сероватого цвета внизу, используя NEAREST , LINEAR и LANCZOS4 соответственно:

Исходный двоичный объект # 2 —[warpPolar] -> введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

… а затем с большим радиусом…

введите описание изображения здесь

Комментарии:

1. Вы отображаете или записываете искаженное изображение? Можете ли вы включить код, который вы используете для его отображения? Можете ли вы опубликовать исходное изображение?

Ответ №1:

Ответ на вопрос заключается в том, что вызову warpPolar() требуется дополнительный флаг, указывающий, как заполнять пиксели за пределами исходного изображения. Это исправило:

 warpPolar( m, polar, Size(), Point( mom.m10/mom.m00, mom.m01/mom.m00) , len, INTER_LINEAR | CV_WARP_FILL_OUTLIERS);