У меня есть пользовательская функция, чтобы вычислить вес между двумя пикселями (которые представляют собой узлы на графике) изображенийMATLAB, использование пользовательская функция с pdist
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
- изображение в сером масштабе и r
и L
- это константы. Внутри функции imgint1
и imgint2
представлены интенсивности серого в пикселях на a
и b
.
Мне нужно рассчитать вес между множеством точек изображения.
Вместо двух вложенных циклов я хочу использовать функцию pdist, потому что это WAY FASTER!
Например, пусть 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.
EDIT 1
Это короткий пример моего кода, который должен работать, но я получил ошибку, упомянутую ab ове. Если скопировать/вставить код на 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
Просьба представить пример минимальной, полной и поддающейся проверке. см. http://stackoverflow.com/help/mcve В частности, отсутствуют значения для img, R и L. –
@ A.Donda Я добавил значения для других параметров: 2x2 image 'img = [128 254; 0 255] ',' r = 3', 'L = 55', надеюсь, теперь это может быть ясно. Я ценю, если вы можете мне помочь. – zeellos
Спасибо, но есть еще неопределенные переменные: ac и bc. Сделайте код, чтобы мы могли воспроизвести вашу проблему, но нет другой проблемы. :-) –