【发布时间】:2016-09-21 12:53:15
【问题描述】:
我正在尝试将两个图像分割相互比较。 为此,我将每个图像转换为无符号短值向量,并计算rand error, 根据以下公式:
地点:
这是我的代码(rand 误差计算部分):
cv::Mat im1,im2;
//code for acquiring data for im1, im2
//code for copying im1(:)->v1, im2(:)->v2
int N = v1.size();
double a = 0;
double b = 0;
for (int i = 0; i <N; i++)
{
for (int j = 0; j < i; j++)
{
unsigned short l1 = v1[i];
unsigned short l2 = v1[j];
unsigned short gt1 = v2[i];
unsigned short gt2 = v2[j];
if (l1 == l2 && gt1 == gt2)
{
a++;
}
else if (l1 != l2 && gt1 != gt2)
{
b++;
}
}
}
double NPairs = (double)(N*N)/2;
double res = (a + b) / NPairs;
我的问题是每个向量的长度是 307,200。 因此总迭代次数为 47,185,920,000。
它使得整个进程的运行时间很慢(几分钟就可以计算出来)。 你知道我该如何改进它吗?
谢谢!
【问题讨论】:
-
你能创建一个 {value -> count} 的哈希映射吗?这会将运行时间从 O(n^2) 减少到 O(n)。
-
这意味着你应该只需要外循环(我认为)——对于每个
i,查找v1[i],结果就是你需要添加到a。跨度> -
@OliverCharlesworth - 好主意!我会试试的。
-
您不需要测试这些对。您只需要知道对象的交叉点中有多少元素。根据这些值,您可以轻松计算出
a和b。 -
@VittorioPatriarca 我正在阅读 the algorithm,就像 drorco 一样。我认为pair的索引需要对应。
标签: c++ algorithm opencv image-processing optimization