#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);
Вот изображение, которое работает нормально:
Вот изображение, которое привело к появлению радуги артефактов примерно на четверти пути вниз и полосы сероватого цвета внизу, используя NEAREST , LINEAR и LANCZOS4 соответственно:
… а затем с большим радиусом…
Комментарии:
1. Вы отображаете или записываете искаженное изображение? Можете ли вы включить код, который вы используете для его отображения? Можете ли вы опубликовать исходное изображение?
Ответ №1:
Ответ на вопрос заключается в том, что вызову warpPolar() требуется дополнительный флаг, указывающий, как заполнять пиксели за пределами исходного изображения. Это исправило:
warpPolar( m, polar, Size(), Point( mom.m10/mom.m00, mom.m01/mom.m00) , len, INTER_LINEAR | CV_WARP_FILL_OUTLIERS);