当前位置: 首页 > 知识库问答 >
问题:

图像之间的欧氏距离

李谦
2023-03-14

>

  • 将图像重塑为一对列向量和行向量:

    Ip = Ip(:).';
    Is = Is(:);
    

    计算度量矩阵G,其条目由公式给出

    G(i,j) = 1/(2*pi*r*r) * exp((-d*d)/(2*r*r));
    

    其中,r是一个从0到20变化的全局参数,d是像素i和像素j之间的距离。E、 例如,如果像素i是(k,l),像素j是(k1,l1),则d=sqrt((k-k1)^2(l-l1)^2) 。像素1将是(1,1),像素2将是(1,2),依此类推。因此,矩阵G的大小将为1638400×1638400。

    计算两个图像之间的最终(标量)欧几里得距离,使用:

    ImEuDist = sqrt( (Ip-Is) * G * (Ip-Is).' );  
    

    我已经使用mex函数编写了一些代码,但在给出结果之前花费了太长时间(5-6小时)-有关代码和更多讨论,请参阅此SO问题。

    请帮我优化这个;我希望它能在几秒钟内运行。请注意,我对涉及GPU的解决方案不感兴趣。

  • 共有1个答案

    冷英博
    2023-03-14

    如果我理解正确,您应该能够执行以下操作,并在2s下运行它:

    样本数据:

    s1 = 8192; s2 = 200;
    img_a = rand(s1, s2);
    img_b = rand(s1, s2);
    r = 2;
    

    以及计算本身:

    img_diff = img_a - img_b;
    kernel = bsxfun(@plus, (-s1:s1).^2.', (-s2:s2).^2);
    kernel = 1/(2/pi/r^2) * exp(-kernel/ (2*r*2));
    g = conv2(img_diff, kernel, 'same');
    res = g(:)' * img_diff(:); 
    res = sqrt(res);
    

    上述过程大约需要25秒。要降到2秒,需要用更快的基于fft的卷积来代替标准的conv2。看看这个和这个:

    function c = conv2fft(X, Y)
        % ignoring small floating-point differences, this is equivalent
        % to the inbuilt Matlab conv2(X, Y, 'same')
        X1 = [X zeros(size(X,1), size(Y,2)-1);
              zeros(size(Y,1)-1, size(X,2)+size(Y,2)-1)];
        Y1 = zeros(size(X1)); 
        Y1(1:size(Y,1), 1:size(Y,2)) = Y;
        c = ifft2(fft2(X1).*fft2(Y1));
        c = c(size(X,1)+1:size(X,1)+size(X,1), size(X,2)+1:size(X,2)+size(X,2));
    end
    

    顺便说一句,如果您仍然希望它运行得更快,您可以利用这样一个事实,即对于相当小的d,exp(-d^2/r^2)非常接近于零:因此您实际上可以将内核裁剪为一个很小的矩形,而不是上面建议的大矩形。更小的内核意味着conv2fft(尤其是conv2)将运行得更快。

     类似资料:
    • 返回两点之间的欧氏距离。 使用 Math.hypot() 计算两点之间的欧氏距离( Euclidean distance)。 const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); distance(1, 1, 2, 3); // 2.23606797749979

    • 我试图将X Y Z变量的数组或列表传递给计算欧几里德距离的方法。 这是我的方法: 这是我的主要代码: 输出为:1.7782794。。应该是10的时候。有什么想法吗?

    • 我在一个列表中有8个点,我需要计算所有可能对之间的欧几里德距离。我可以编写一个for循环并继续计算距离,但是python/numpy/others有更好的方法吗? 坐标点:

    • 我想写一个函数来计算中的坐标与中的每个坐标之间的欧氏距离,并通过列生成维度行的距离数组(其中是中的坐标数,是中的坐标数)。 NB:为了简单起见,我不想使用任何其他库。 运行该函数将生成: 我一直在试着运行下面的程序 但我得到以下错误: 非常感谢。

    • 假设我有一个有两列X和Y的表T,我想找到所有的元组对,其中使用每个元组X和Y计算它们的欧几里得距离的结果等于某个值D。 此外,这不能有重复。即两个元组的对(X,Y)和相同的两个元组的(Y,X)不能在结果中。 在没有给我答案的情况下,有没有人能够指导我用sql查询来回答这个问题?我已经绞尽脑汁几个小时了,我不知道该从哪里开始。

    • 我有一份清单。我想找到所有对和自身之间的欧几里德距离,并创建一个2D numpy数组。当对不同时,其自身之间的距离的位置和值将为0。列表列表的示例:我想要的结果是 x表示差异的值。周期意味着结果应遵循矩阵中所示。我需要python代码方面的帮助。行和列中0、1、2等的数量定义了内部列表索引。