Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 在Python中使用OpenCV重新映射时出现意外行为_Image_Opencv_Remap - Fatal编程技术网

Image 在Python中使用OpenCV重新映射时出现意外行为

Image 在Python中使用OpenCV重新映射时出现意外行为,image,opencv,remap,Image,Opencv,Remap,在Opencv中使用cv2.remap函数时,我遇到无法解释的行为。我做了一个函数,将每个像素的y坐标向上平移一个在每个x坐标上不同的数字。根据从x=0开始到x=640结束的基础曲线计算数字(对于360 x 640图片) 大约一周前,我发布了一个问题,但有一个不同的问题-图片的顶部被裁剪了。回答了这个问题,我了解到问题在于原始图像中的几个像素被映射到新图像中的相同位置,因此首先映射到顶部的像素被来自下部的其他像素覆盖 然而,我现在面临的问题有点不同,这就是为什么我发布了一个新问题。在本例中,问题

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

大约一周前,我发布了一个问题,但有一个不同的问题-图片的顶部被裁剪了。回答了这个问题,我了解到问题在于原始图像中的几个像素被映射到新图像中的相同位置,因此首先映射到顶部的像素被来自下部的其他像素覆盖

然而,我现在面临的问题有点不同,这就是为什么我发布了一个新问题。在本例中,问题在于,由于我将所有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
其中,
y值[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
然而,这一次,图像被完全填充,底部没有空白。您可以看到以下两幅图像:

(像素化的效果不是我想要的,但这是我要解决的:))。我已经检查了x=383的
map_y
数组中特定列的所有条目,并且所有值都大于199.102,因此,这似乎与前一种情况不同,即列中没有较高的像素映射到较低的部分

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


很抱歉写了这么长的帖子,但我已经试着找出原因好几天了,结果还是一无所获。任何帮助都将不胜感激。

我想您误解了remap()的工作原理。 让我引用函数initUnderTortRectiveyMap()的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) 该值位于源图像的边界之外

你是对的,我确实误解了映射函数的工作原理。我现在已经设法使图像转换按预期工作。非常感谢。