You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否利用精灵图的积分图提取其中特定子图的积分图?

从精灵图的积分图中提取特定子图的积分图是否可行?

可以实现,核心是利用积分图的区域和计算规则,推导子图积分图中每个点对应的值。

问题背景与示例

已知一张精灵图及其对应的积分图,需要提取精灵图中某一特定子区域(ROI)的积分图。示例如下:

# 子图在精灵图中的单图尺寸
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.]]

# 目标子图的左上角与右下角坐标(1-based)
top_left_ROI : (2, 2)
bottom_right_ROI : (3, 3)

# 期望输出的子图积分图
output :
[[1, 3],
 [4, 10]]

实现原理

积分图的核心定义是:积分图中任意点I(x,y)的值,等于原始图像从左上角(0,0)到(x,y)的矩形区域内所有像素的总和(注:此处坐标以0-based为例,若为1-based只需调整边界计算)。

对于子图的积分图,其中任意一点S(i,j)(对应子图内的坐标,从(0,0)到(h-1,w-1),h、w为子图的高和宽),其值等于子图中从左上角(0,0)到(i,j)的区域和,对应到原始精灵图中就是从(x1,y1)到(x1+i, y1+j)的矩形区域和(x1,y1是子图左上角在原始精灵图中的坐标)。

利用积分图的区域和计算公式,这个值可以通过原始精灵图的积分图直接计算:

S(i,j) = I[x1+i][y1+j] 
         - (I[x1-1][y1+j] if x1 > 0 else 0) 
         - (I[x1+i][y1-1] if y1 > 0 else 0) 
         + (I[x1-1][y1-1] if x1 > 0 and y1 > 0 else 0)

结合示例验证

以示例中的参数为例(坐标采用1-based,转换为0-based后子图左上角为(1,1),右下角为(2,2)):

  • 子图S(0,0):对应原始区域(1,1)到(1,1),计算得10 - 3 - 4 + 1 = 1,与输出一致。
  • 子图S(0,1):对应原始区域(1,1)到(1,2),计算得14 - 6 - 4 + 1 = 3,与输出一致。
  • 子图S(1,0):对应原始区域(1,1)到(2,1),计算得13 - 3 - 10 + 1 = 4,与输出一致。
  • 子图S(1,1):对应原始区域(1,1)到(2,2),计算得18 - 6 - 13 + 3 = 10,与输出一致。

总结

只要知道子图在原始精灵图中的坐标范围,就可以通过上述公式遍历计算子图积分图的每一个像素值,完全不需要依赖原始精灵图本身,仅用其积分图即可实现需求。

内容的提问来源于stack exchange,提问作者Noob Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:52:51