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