能否利用精灵图的积分图提取其中特定子图的积分图?
从精灵图的积分图中提取特定子图的积分图是否可行?
可以实现,核心是利用积分图的区域和计算规则,推导子图积分图中每个点对应的值。
问题背景与示例
已知一张精灵图及其对应的积分图,需要提取精灵图中某一特定子区域(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
相关产品推荐
相关产品推荐

