从精灵表的积分图像计算特定的积分图像?

问题描述 投票:0回答:1

假设我有整个精灵表的完整图像。是否可以使用精灵表的积分图像检索精灵表中特定图像的积分图像?

我试图建立精灵表积分图像的每个像素之间的关系,但我没有找到任何相关信息。因此,我不确定是否有可能实现这一目标。

示例:

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]]
python image-processing computer-vision integral
1个回答
0
投票

您可以从较大的积分图像中切出相应的区域,然后按以下方式调整值。

只需减去前面的行和列,“零”行/列就变成零。

我将使用一种保留“零”行和列的格式。这使得索引和算术变得更简单。

鉴于:

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)
这就是您正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.