1

我在 cv2 中的图像上有一个选择蒙版,我想扩展像素的选择,以便可以将已选择像素的半径 R 内的每个像素添加到选择中。

我希望它与 Photoshop 中的扩展功能相同。

我能想到的唯一方法是查看图像中的每个像素,如果它在选择中,则将半径 R 内的每个像素更改为选择的一部分。

最大的问题是它的运行时间为 O(R^2 * # of pixel)。

这真的很慢,而且我知道一定有更好的方法,因为 Photoshop 扩展选择方法几乎可以立即用于大图片。所以我想要一种方法来改变我在 cv2 或 numpy 中的方法以使其更快。(也许有办法对其进行矢量化,但我不知道)

4

1 回答 1

0

我想出了如何扩展选择,唯一的问题是它可能在图像边缘有一些错误。假设您有一个布尔值掩码,这实际上非常简单。除了它实际上并不重要,如果掩码为零表示非选定区域,正数表示选定区域,它仍然有效。

def expand(selection, radius):
    cop = np.copy(selection)
    for x in range(-radius,radius+1):
        for y in range(-radius,radius+1):
            if (y==0 and x==0) or (x**2 + y**2 > radius **2):
                continue
            shift = np.roll(np.roll(selection, y, axis = 0), x, axis = 1)
            cop += shift

    return cop
    

这是一个运行良好的快速示例

sel = np.array([[False, False, False, False, False],\
                [False, False, False, False, False],\
                [False, False, True, False, False],\
                [False, False, False, False, False],\
                [False, False, False, False, False]])
expand(sel, 2)

这运行得更快,我也相信它是 O(R^2) 相当快。它还为选择提供了与 Photoshop 扩展功能类似的结果。我相信唯一的区别是我的方法选择落在半径 R 的圆内的像素,但 Photoshop 选择半径为 R 的六边形内的像素,这是可以添加到 if 语句中的细微差别。

于 2020-09-24T21:07:03.093 回答