1

我有一个自定义函数来计算图像的两个像素(表示图形上的节点)之间的权重

function [weight] = getWeight(a,b,img, r, L)
    ac = num2cell(a);
    bc = num2cell(b);
    imgint1 = img(sub2ind(size(img),ac{:})); 
    imgint2 = img(sub2ind(size(img),bc{:}));
    weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);

其中a = [x1 y1]b = [x2 y2]是表示图像像素的坐标,img是灰度图像,rL是常数。在函数imgint1和是和imgint2上像素的灰度强度。ab

我需要计算图像的一组点之间的权重。

我想使用 pdist 函数而不是两个嵌套循环,因为它更快!

例如,让nodes一组像素坐标

nodes  =
 1     1
 1     2
 2     1
 2     2

img = [ 128 254; 0 255], r = 3,L = 255

为了获得这些权重,我使用了一个中间函数。

function [weight] = fxIntermediate(a,b, img, r, L)

    weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);

为了最终得到整套权重

distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));

但它总是给我一个错误

Error using pdist (line 373)
Error evaluating distance function '@(XI,XJ)fxIntermediate(XI,XJ,img,r,L)'.

Error in obtenerMatriz (line 27)
    distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L));

Caused by:
    Error using bsxfun
    Invalid output dimensions.

编辑 1

这是我的代码的一个简短示例,它应该可以工作,但我得到了上面提到的错误。如果您在 MATLAB 上复制/粘贴代码并运行代码,您将看到错误

function [adjacencyMatrix] = problem
    img = [123, 229; 0, 45];                % 2x2 Image as example
    nodes  = [1     1;  1     2; 2     2];  % I want to calculate distance function getWeight()
                                            % between pixels img(1,1), img(1,2), img(2,2) 
    r = 3;                                  % r is a constant, doesn't matter its meaning
    L = 255;                                % L is a constant, doesn't matter its meaning

    distNodes = pdist(nodes,@(XI,XJ) fxIntermediate(XI,XJ,img,r,L)); 
    adjacencyMatrix = squareform(distNodes );
end

function [weight] = fxIntermediate(a,b, img, r, L)
    weight = bsxfun(@(a,b) getWeight(a,b,img,r,L), a, b);
end

function [weight] = getWeight(a,b,img, r, L)
    ac = num2cell(a);
    bc = num2cell(b);
    imgint1 = img(sub2ind(size(img),ac{:})); 
    imgint2 = img(sub2ind(size(img),bc{:}));
    weight = (sum((a - b) .^ 2) + (r^2/L) * abs(imgint2 - imgint1)) / (2*r^2);
end

我的目标是获得一个表示像素之间距离的邻接矩阵。对于上面的示例,所需的邻接矩阵是:

adjacencyMatrix =    
          0         0.2634     0.2641
          0.2634    0          0.4163
          0.2641    0.4163     0
4

1 回答 1

0

问题是您既没有满足对要使用的函数的期望,也没有满足对要使用的函数的pdist期望bsxfun

– 来自以下文档pdist

距离函数必须是形式

d2 = distfun(XI,XJ)

将一个 1×n 向量 XI 作为参数,对应于 X 的单行,以及一个 m2×n 矩阵 XJ,对应于 X 的多行。 distfun 必须接受具有任意行数的矩阵 XJ。distfun 必须返回距离为 d2 的 m2×1 向量,其第 k 个元素是 XI 和 XJ(k,:) 之间的距离。

但是,通过使用bsxfunin fxIntermediate,此函数始终返回一个值矩阵,其大小是两个输入的大小中较大的一个。

– 来自以下文档bsxfun

C = fun(A,B) 形式的二进制逐元素函数接受任意但大小相等的数组 A 和 B,并返回相同大小的输出。输出数组 C 中的每个元素都是仅对 A 和 B 的相应元素进行操作的结果。fun 还必须支持标量扩展,这样如果 A 或 B 是标量,则 C 是将标量应用于另一个输入数组中的每个元素的结果。

但是,您getWeight似乎总是返回一个标量。

我不太了解您的问题,无法修复此问题。此外,我认为如果速度是你所追求的,那么pdist用函数句柄喂食不是要走的路。pdist不施魔法;它之所以快,是因为它内置的距离函数被有效地实现了。此外,您正在使用匿名函数句柄以及与元胞数组之间的转换,所有这些都会减慢进程。我认为您应该发布一个新问题,从描述您尝试计算的内容开始,包括一些即使效率低下也能完成这项工作的代码,并询问如何改进它。

于 2015-04-17T14:18:09.377 回答