在Python

时间:2017-01-12 22:22:42

标签: image opencv remap

在Opencv中使用cv2.remap函数时遇到无法解释的行为。我已经创建了一个函数,将每个像素的y坐标向上转换为每个x坐标不同的数字。该数字根据从x = 0开始并在x = 640结束的基础曲线计算(对于360 x 640图片)

大约一周前,我发布了一个问题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]是x坐标j处曲线的y坐标。果然,当在x = 383打印map_y数组的前10行的y映射时,最低数字是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 个答案:

答案 0 :(得分:1)

我认为您误解了remap()的工作原理。 让我引用函数initUndistortRectifyMap()的OpenCV文档:

“该函数实际构建了remap()使用的逆映射算法的映射。即,对于目标图像中的每个像素(u,v),该函数计算源图像中的相应坐标。 “

所以你的行

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

实际上意味着映射图像中像素(383,0)的值取自原始图像中的像素(383,199.102)。

如果出现以下情况,则不会映射像素: a)map_x [i] [j]或map_y [i] [j]的值为-1(短地图类型为-16) 要么 b)该值超出源图像的边界。