问题
我有一个任意半径的圆形 bool 掩码(总是完全对称的):

array([[False, False,  True, False, False],
       [False,  True,  True,  True, False],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True, False],
       [False, False,  True, False, False]], dtype=bool)
然后我有一个很大的 uint8 矩阵, image 和这个矩阵中的一对可以是它的任何有效索引, point
我想要做的是在图像的这个点上应用这个蒙版,这样我基本上可以在 image 的那个点放置一个圆圈。
这在图像中间非常简单。你可以这样做:
image[point[0] - radius:point[0] + radius + 1, point[1] - radius:point[1] + radius + 1] = circle_mask
但自然这不处理边界检查,在这种情况下这似乎相当复杂,因为我必须确保我们分配给的 image 范围与正在分配的掩码的大小相同。
例子
如果 point(1, 1) 并且圆掩码的半径是 2,那么假设 image 最初全为零,它最终会是:
array([[ 1.,  1.,  1.,  0.,  0.,  ... ,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  ... ,  0.],
       [ 1.,  1.,  1.,  0.,  0.,  ... ,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  ... ,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  ... ,  0.],
       ...,
       [ 0.,  0.,  0.,  0.,  0.,  ... ,  0.]])
我的解决方案
我想出了以下代码来实现我想要做的事情:
# Initialization of stuff so this is runnable
point = (1, 1)
radius = 2
image = np.zeros((10, 10))
x, y = np.ogrid[-radius : radius + 1, -radius : radius + 1]
circle_mask = x**2 + y**2 <= radius**2

# My solution to the problem
image_min_row = max(point[0] - radius, 0)
image_min_col = max(point[1] - radius, 0)
image_max_row = min(point[0] + radius + 1, image.shape[0])
image_max_col = min(point[1] + radius + 1, image.shape[1])

mask_min_row = max(radius - point[0], 0)
mask_min_col = max(radius - point[1], 0)
mask_max_row = min(image.shape[0] - point[0] + radius, circle_mask.shape[0])
mask_max_col = min(image.shape[1] - point[1] + radius, circle_mask.shape[1])

temp_mask = circle_mask[mask_min_row:mask_max_row, mask_min_col:mask_max_col]
image[image_min_row:image_max_row, image_min_col:image_max_col][temp_mask] = 1
我的问题
我的解决方案感觉非常冗长。当我想出它时,它花了很多令人头疼的算术争论,并且有几个逐一的错误。我怀疑是否有一些更简单的方法来做到这一点。我可以通过某种方式获取掩码,将其定位,使其中心位于 point 上方,并根据该掩码分配值,忽略越界元素。
NumPy 有办法做到这一点吗?

最佳答案

可以直接根据图像的索引创建掩码,消除边界检查:

x = np.arange(image.shape[0])
y = np.arange(image.shape[1])
image[np.add.outer((x-point[0])**2, (y-point[1])**2) <= radius**2] = 1

这里 x, y 是 image 数组的索引,第三行说明了应该发生赋值的条件。

关于numpy - 基于放置在像素上的小掩码分配值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41583040/

10-12 22:00