【问题标题】:Unexpected behaviour when using OpenCV remap in Python在 Python 中使用 OpenCV 重映射时出现意外行为
【发布时间】:2017-05-28 04:52:55
【问题描述】:

在 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

但是,这一次,图像被完全填满,底部没有空白。您可以在下面看到这两张图片:

(像素化效果不是我想要的,但这是我要修复的:))。我已经检查了 map_y 数组中特定列的所有条目是否为 x=383 并且所有值都 > 199.102 所以看起来这与前一种情况不同,即列中没有更高的像素被映射到下部。

所以我的问题是,导致这种剧烈变化的两个映射之间有什么不同?我预计由于第二张图像的映射也是从一个高值开始的,所以底部也会有一个空白区域

为这篇长篇文章道歉,但几天来我一直在努力找出原因,但结果并不明智。任何帮助将不胜感激。

【问题讨论】:

    标签: image opencv remap


    【解决方案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) 该值在源图像的边界之外。

    【讨论】:

    • 你说得对,我确实误解了映射功能的工作原理。我现在已经设法使图像转换按预期工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多