gpt4 book ai didi

numpy - 基于放置在像素上的小掩码分配值

转载 作者:行者123 更新时间:2023-12-05 00:53:13 24 4
gpt4 key购买 nike

问题
我有一个任意半径的圆形 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
我的问题
我的解决方案感觉非常冗长。当我想出它时,它花了很多令人头疼的算术争论,并且有几个逐一的错误。我怀疑是否有一些更简单的方法来做到这一点。我可以采取某种方式将 mask 放置在其中心上方 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com