如何以最快的方式做到这一点?图像数组
本文关键字:这一点 图像 数组 方式做 | 更新日期: 2023-09-27 18:34:50
我有一个在 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");
我认为使用字典来存储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);
如果pq
中的像素值范围允许(例如 16 bpp = 65536 个条目(,则可以创建一个辅助数组,将所有可能的灰度级别映射到 pg
中的索引值。填充此数组是通过单次遍历pg
完成的(初始化到所有零之后(。
然后使用直接表查找将list_1d
转换为pgidx
。
如果表格太大(大于图像(,请按照@hatchet回答进行操作。