作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
我有一个任意半径的圆形 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
并根据该掩码分配值,忽略越界元素。
最佳答案
可以直接根据图像的索引创建掩码,消除边界检查:
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
image
的索引数组,并且在第三行中说明了应该进行赋值的条件。
关于numpy - 基于放置在像素上的小掩码分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41583040/
我是一名优秀的程序员,十分优秀!