假设我有整个精灵表的完整图像。是否可以使用精灵表的积分图像检索精灵表中特定图像的积分图像?
我试图建立精灵表积分图像的每个像素之间的关系,但我没有找到任何相关信息。因此,我不确定是否有可能实现这一目标。
示例:
image_shape_in_sprite_sheet : (2, 2)
sprite_sheet :
[[1 2 1 2]
[3 4 3 4]
[1 2 1 2]
[3 4 3 4]]
sprite_sheet_integral :
[[ 1. 3. 4. 6.]
[ 4. 10. 14. 20.]
[ 5. 13. 18. 26.]
[ 8. 20. 28. 40.]]
top_left_ROI : (2, 2)
bottom_right_ROI : (3, 3)
output :
[[1, 3],
[4, 10]]
您可以从较大的积分图像中切出相应的区域,然后按以下方式调整值。
只需减去前面的行和列,“零”行/列就变成零。
我将使用一种保留“零”行和列的格式。这使得索引和算术变得更简单。
鉴于:sprite_sheet = np.uint8([
[1, 2, 1, 2],
[3, 4, 3, 4],
[1, 2, 1, 2],
[3, 4, 3, 4],
])
y0,y1,x0,x1 = 2,4, 2,4
sprite = sprite_sheet[y0:y1, x0:x1]
array([[1, 2],
[3, 4]], dtype=uint8)
sheet_integral = cv.integral(sprite_sheet)
array([[ 0, 0, 0, 0, 0],
[ 0, 1, 3, 4, 6],
[ 0, 4, 10, 14, 20],
[ 0, 5, 13, 18, 26],
[ 0, 8, 20, 28, 40]], dtype=int32)
这就是你想要的,但是从大的中切出来:cv.integral(sprite)
array([[ 0, 0, 0],
[ 0, 1, 3],
[ 0, 4, 10]], dtype=int32)
让我们选取该切片(包含前面的行和列):sheet_integral[y0:y1+1, x0:x1+1]
array([[10, 14, 20],
[13, 18, 26],
[20, 28, 40]], dtype=int32)
现在调整其值。减去前面的行和列,使它们变为零,就像大的一样。这使用了 numpy 广播语义,这就是为什么我要做一个
0:1
切片而不是只获取索引
0
。foo = sheet_integral[y0:y1+1, x0:x1+1].copy()
foo -= foo[0:1, :]
print(repr(foo))
foo -= foo[:, 0:1]
print(repr(foo))
array([[ 0, 0, 0],
[ 3, 4, 6],
[10, 14, 20]], dtype=int32)
array([[ 0, 0, 0],
[ 0, 1, 3],
[ 0, 4, 10]], dtype=int32)
这就是您正在寻找的。