OpenCV warpPerspective()中的离群像素

5

我的应用程序需要将一个四边形映射到另一个四边形,但这两个四边形都不是矩形。

然而,我从warpPerspective()得到的结果总是一个矩形。我已经尝试将“outlier”标志设置为不同的值,以防止来自变形四边形外部的像素出现在目标图像中,但似乎没有任何作用。我想要的是一个变形后的四边形,其外部像素设置为透明。

我该怎么做才能实现这一点?

或者,是否有一种直接的方法在OpenCV中屏蔽四边形外部区域,以便我可以只复制四边形到另一张图片中?

如果相关的话,我正在使用OpenCV的Python绑定。

这是我的当前代码:

def warpImage(image, corners, target, width, height):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = numpy.zeros(shape=(width, height), dtype="uint8")
    out = cv2.warpPerspective(image, mat, (width,height), out, cv2.INTER_CUBIC)
    return out

corners和target都是非矩形四边形。输出是一个完整的宽度x高度矩形。没有任何黑色或透明的像素,而是来自四边形内外图像的像素。我只需要里面的像素。


请您提供一个当前扭曲的四边形图像,以更好地说明您的问题。 - Rui Marques
我有点不清楚这会如何帮助。结果是一个矩形,所有像素都可见。我想要一个非矩形的四边形,其外部的位是透明的。我提供了非矩形的四边形作为输入。 - Kevin Jardine
好的,也许你应该提供一段代码示例来说明你正在做什么。因为warpPerspective确实应该输出一个四边形,而四边形外的像素应该被涂成黑色。 - Rui Marques
好的,我已经完成了。你描述的行为将会和透明一样好。但是我没有看到它。 - Kevin Jardine
1个回答

0
我发现最好的选择是循环遍历像素,并使用 matplotlib 的 pnpoly() 函数将翘曲四边形中的像素复制到重新映射数组中,如下所示:
import matplotlib.nxutils as nx 

def warpImage(image, corners, target, width, height, x0, y0, remap):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = cv2.warpPerspective(image, mat, (width,height), flags=cv2.INTER_CUBIC)
    for x in range(0,width):
        for y in range(0,height):
            if nx.pnpoly(x,y,target) == 1:
                for i in range(0,3):
                    remap[y+y0,x+x0,i] = out[y,x,i]

    return remap

我循环遍历图像中的所有四边形,并在remap中累积变换后的版本。

需要访问每个像素并不是非常高效,但幸运的是这是一次性的转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接