首页 > 解决方案 > 为什么 OpenCV 的 polarWarp 会在某些图像中引入伪影?

问题描述

我有一些小的(通常约为 60x60 或更少)BGR 图像,我使用 OpenCV 的 warpPolar 为其生成极坐标投影。大多数情况下它工作正常,但偶尔我会得到一张图像(来自与工作正常的图像相同的相机源),其中有散布的伪影。三种不同的插值方法都会产生伪影。我确实发现增加极半径会消除伪影,但有人可以解释为什么会有所作为吗?

这是调用 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);

这是一个可以正常工作的图像:

源 blob #1 --[warpPolar]--> Blob #1 极地投影

这是一张图像,分别使用 NEAREST、LINEAR 和 LANCZOS4,在向下约四分之一处产生了彩虹状的伪影,并在底部出现了一条灰色带:

源 blob #2 --[warpPolar]-> 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

...然后半径更长...

在此处输入图像描述

标签: c++opencvpolar-coordinatesremap

解决方案


这个问题的答案是 warpPolar() 调用需要一个额外的标志来指定如何填充源图像之外的像素。这修复了它:

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

推荐阅读