Algorithm 分层图像的快速子矩形

Algorithm 分层图像的快速子矩形,algorithm,image-processing,data-structures,Algorithm,Image Processing,Data Structures,我有一个二维光栅,它的层数从1到20个(随机大小和偏移量)。我正在寻找访问子矩形视图(具有随机大小和偏移)的快速方法。视图应返回每个X和Y坐标的所有分层像素 我猜这就是GIMP或其他2d绘画应用程序在彼此之间绘制图层的方式,但我希望所有像素都在彼此之间,而不仅仅是顶部像素隐藏其下其他像素的投影 我以前遇到过这个问题,现在也遇到了,我已经花了很多时间在网上和这里搜索类似的问题,但找不到任何问题。我将描述两种可能的解决方案,这两种方案我都不满意: 拥有一个预先分配大小的基本3d阵列。这很容易管理,但

我有一个二维光栅,它的层数从1到20个(随机大小和偏移量)。我正在寻找访问子矩形视图(具有随机大小和偏移)的快速方法。视图应返回每个X和Y坐标的所有分层像素

我猜这就是GIMP或其他2d绘画应用程序在彼此之间绘制图层的方式,但我希望所有像素都在彼此之间,而不仅仅是顶部像素隐藏其下其他像素的投影

我以前遇到过这个问题,现在也遇到了,我已经花了很多时间在网上和这里搜索类似的问题,但找不到任何问题。我将描述两种可能的解决方案,这两种方案我都不满意:

  • 拥有一个预先分配大小的基本3d阵列。这很容易管理,但存储浪费和内存开销非常大。对于包含16个插槽(每个插槽4个字节)的4k光栅来说,是否相当于1Gib的内存?在应用程序中,大部分空间将被浪费,而不是被使用

  • 我以前提出的解决方案。有两个二维数组,一个带有索引,另一个带有实际值。第一个数组中的每个“像素”表示在第二个数组中的哪个像素范围内可以找到所有层的实际像素。这在大小上得到了很好的压缩,但任何请求都会在两个内存区域之间跳转,设置起来有点麻烦,更不用说更新了(这是一个很好的特性,但不是强制性的)

  • 所以。。。在这类问题上有什么诀窍吗?提前谢谢你

    忘了补充一下,我的目标是自给自足,最好是单线程,CPU解决方案。这些层很可能是带有alpha的灰度级(也就是说,某些像素数据将不存在)。查找操作优先,添加/删除图层等更新可能会更慢

    由Mark添加(参见注释): 在该图像中,若取红色矩形的左上角,则查找应报告红色、绿色、蓝色和黑色。如果使用了右下角,则应仅报告红色和黑色

  • 我会将偏移量和大小存储在与像素数据分离的数据结构中。这样,在计算每个层的相对坐标时(或者即使可以忽略某些层),也不会在内存中跳转

  • 如果您想访问单个像素或小区域,而不是迭代大区域,那么在访问彼此相邻的像素或区域(在x或y方向)时,最好使用更多的本地内存访问来存储数据

  • 我会将偏移量和大小存储在与像素数据分离的数据结构中。这样,在计算每个层的相对坐标时(或者即使可以忽略某些层),也不会在内存中跳转

  • 如果您想访问单个像素或小区域,而不是迭代大区域,那么在访问彼此相邻的像素或区域(在x或y方向)时,最好使用更多的本地内存访问来存储数据


  • 我很难理解你的意思,“插槽”、“视图”和“分层像素”。我希望你不介意,(如果你介意的话就删除它),但是我添加了一个简单的图表,希望你能允许我解释一下你实际拥有的相对于图表的东西,以及你真正想要的东西,好吗?谢谢。我想问的是。。。你有图像吗,或者你真的知道蓝色矩形的角在哪里?你的“分层光栅”是像我一样的纯色,还是更像是色彩丰富的照片?最后,给出什么,你想知道什么?@MarkSetchell我想你已经正确地理解了,从你的图表来看。每个图层上的实际数据未定义,可以是rgba,也可以是灰度。值得注意的是,这些可以包含“空洞”、空像素或全阿尔法。我将用这些信息更新一下这个问题。希望它会更清晰,与您的形象一起-谢谢!对不起,我还不清楚。你有图像吗,或者你知道蓝色盒子的角落在哪里吗?你想知道什么?是的,图层数据是已知的。角落、大小、数据类型等。我在搜索性能-如何组织数据以及如何访问数据。我很难理解“插槽”、“视图”和“分层像素”的含义。我希望你不介意,(如果你介意的话就删除它),但是我添加了一个简单的图表,希望你能允许我解释一下你实际拥有的相对于图表的东西,以及你真正想要的东西,好吗?谢谢。我想问的是。。。你有图像吗,或者你真的知道蓝色矩形的角在哪里?你的“分层光栅”是像我一样的纯色,还是更像是色彩丰富的照片?最后,给出什么,你想知道什么?@MarkSetchell我想你已经正确地理解了,从你的图表来看。每个图层上的实际数据未定义,可以是rgba,也可以是灰度。值得注意的是,这些可以包含“空洞”、空像素或全阿尔法。我将用这些信息更新一下这个问题。希望它会更清晰,与您的形象一起-谢谢!对不起,我还不清楚。你有图像吗,或者你知道蓝色盒子的角落在哪里吗?你想知道什么?是的,图层数据是已知的。角落、大小、数据类型等。我正在搜索性能-如何组织数据以及如何访问数据。看起来您的第一个选项就是我在第二个选项中描述的?基本上,这是两个数组,你必须遍历它们,因此你要读取第一个数组,获取坐标,转到第二个数组,获取实际数据。这就是我所说的反弹。从技术上讲,我想这是我能做的最好的事情之一。我们想到的一个小改进是为相同的或sa附近的应用程序提供一个小缓存