我正在研究计算机视觉问题,我必须合并图像的区域。区域(或blob)由其线定义,即O
的以下区域:
0123456789
0 XXXXOXXXXX
1 XXXOOOXXXX
2 XXXOOXXXXX
3 XXXOXXXXXX
4 XXXXXXXXXX
定义为:
row: 0, cols: 4-4
row: 1, cols: 3-5
row: 2, cols: 3-4
row: 3, cols: 3-3
我选择了这个数据结构,因为我需要能够快速找到一个区域的邻居,即所有“触摸”它的像素。
现在,我的问题是我想合并两个区域,即计算它们的并集。这意味着我可能会在上面显示的数据结构中找到几个列范围。
通过此设置,我有两个问题:
在C
中,此数据的最佳数据结构是什么?典型的图像是16x16,这意味着没有那么多的行/列。我会做很多合并(事情的目标是从每个像素的一个区域开始,以一个大区域结束,即16x16 - 1合并)。我可以使用指针并分配/释放这些东西,或者使用char *存储cols并在之后解析它。例如。
如何有效合并两个地区?我需要找到与其相邻的潜在列(例如,3-5
和6-9
成为3-9
),最好不要总是重新分配和复制内容。
答案 0 :(得分:2)
如果您的数据是双色图像...黑白,为什么不使用16个元素长的无符号短裤数组呢?
unsigned short image[16]
可以使用按位逻辑完成合并,这对于16个元素阵列非常有效。
答案 1 :(得分:1)
由于你说你有少量的行和列,最好的结构可能只是一个简单的多维数组。对于这些小尺寸,由于能够在恒定时间内找到邻居而获得的任何速度提升可能会被内存访问延迟和执行合并操作所花费的时间所掩盖。
Billy3
答案 2 :(得分:0)
你是否愿意以速度换空间?在这种情况下,您可以静态分配整个16x16结构。
struct Image {
struct Range ranges[16*16];
};
每一行([0..15],[16..31] ...)将包含最多16个不同的范围(假设您没有二进制数据,在这种情况下8将会这样做),最后一个范围将由一些标记值表示,如“-1”或“0”或其他东西。
根据操作的不同,最好将结构范围定义为:
struct Range {
int startpos;
int count; /* or int endpos - depending on your preference */
};
通过创建新图像进行合并很容易 - 您可以从左侧同时遍历两个“输入”图像中的每一行,并输出具有较小“startpos”的图像,如果合并相邻区域,则更新最后写入的区域。
就地合并也不是那么难,一些缓冲区也可以在一次运行中完成。
答案 3 :(得分:0)
如果内存不是问题,则可以通过存储指向相邻像素的指针来提高查找速度。例如,创建一个“Pixel”结构,它将存储其值和一个指向相邻像素的指针列表。如上所述,创建一个16x16的“Pixel”多维数组。设置内存后,浏览阵列并设置邻居像素列表以指向相邻像素。设置好所有内容后,找到一个像素及其邻居应该非常快。