如何以最快的方式做到这一点?图像数组

时间:2014-12-20 05:52:11

标签: c# arrays performance image-processing optimization

我的循环在C#中太慢了。我想知道是否有更快的方法来处理这些数组。我目前正在使用.NET 2.0。我不反对升级这个项目。这是涉及灰度级的理论图像处理概念的一部分。

  • 像素数(PixCnt = 21144402)
  • g_len = 4625
  • list1d - 具有上述像素数上限的图像的一维数组。
  • pg - 灰度级强度持有者。

此函数创建这些值的索引。因此pgidx。

int[] pgidx = new int[PixCnt];
sw = new Stopwatch();
sw.Start();
for (i = 0; i < PixCnt; i++)
{
    j = 0;
    pgidx[i] = 0;
    while (list_1d[i] != pg[j] && j < g_len) j++;
    if (list_id[i] == pg[j])
        pgidx[i] = j
}
sw.stop();
Debug.WriteLine("PixCnt Loop took" + sw.ElapsedMilliseconds + " ms");

2 个答案:

答案 0 :(得分:1)

我认为使用字典存储pg数组中的内容会加快速度。 g_len是4625个元素,因此您可能会平均内部while循环的2312次迭代。用字典中的单个哈希查找替换它应该更快。由于外循环执行了2100万次,因此加速该循环的主体应该获得巨大的回报。我猜测下面的代码会让你的时间加快100到1000倍。

var pgDict = new Dictionary<int,int>(g_len);
for (int i = 0; i < g_len; i++) pgDict.Add(pg[i], i);
int[] pgidx = new int[PixCnt];
int value = 0;
for (int i = 0; i < PixCnt; i++) {
    if (pgDict.TryGetValue(list_id[i], out value)) pgidx[i] = value;
 }

请注意,在找不到匹配项时将pgidx[i]设置为零是不必要的,因为在创建数组时,数组的所有元素都已初始化为零。

如果pg中的值有可能出现多次,您可能需要首先检查是否已添加该密钥,如果有,则跳过将其添加到字典中。这将模仿你目前寻找第一场比赛的行为。为此,用这个替换构建字典的行:

for (int i = 0; i < g_len; i++) if (!pgDict.ContainsKey(pg[i])) pgDict.Add(pg[i], i);

答案 1 :(得分:0)

如果pq中的像素值范围允许(例如16 bpp = 65536个条目),则可以创建一个辅助数组,将所有可能的灰度级映射到pg中的索引值。填充此数组是通过pg上的一次传递完成的(在初始化为全零后)。

然后使用直接表格查找将list_1d转换为pgidx

如果表太大(比图像大),那就像@hatchet一样回答。