问题
我有一个任意半径的圆形 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/