2013-04-29 2 views
0

У меня есть массив линейных индексов и для каждого линейного индекса я хочу найти линейные индексы соседних пикселей в радиусе, скажем, 5-pixels. Я нашел следующий код, который выполняет работу для 8-connected neighborhood. Но как реализовать его, чтобы найти линейные индексы 120 neighbors для района 5-pixel.Найти линейные индексы всех соседей в радиусе вокруг центрального пикселя?

%# target_array: array where pixels are marked 
%# idx: linear index of a marked pixel 
[M,N] = size(target_array) 

neighbor_offsets=[-M-1 -M -M+1 1 M+1 M M-1 -1]; 

neighbors = bsxfun(@plus, idx, neighbor_offsets); 
+0

Можете вы определить 'M' и' idx' в своем коде? – Dan

+1

@ Dan: Я отредактировал вопрос для определения 'M' и' idx' – Jonas

+0

@Amro: хорошая точка! – Jonas

ответ

1

код вы упоминаете находит линейные индексы вокруг пикселя, если пиксель не слишком близко к границе целевого массива.

В вашем случае, я предлагаю вам проходное пикселей по отдельности, и find окрестности:

[M,N] = size(target_array); 

SE = strel('disk',5,inf); 

%# the linear indices are stored in idxList 
nIndices = length(idxList); 

neighbors = cell(nIndices); 

for ii = 1:nIndices 
    idx = idxList(ii); 
    bw = false(M,N); 
    bw(idx) = true; 
    bw = imdilate(bw,SE); 

    %# mask the center 
    bw(idx) = false; 

    neighbors{ii} = find(bw); 
end 

Если вы знаете, что ни один из районов не перекрываются или потрогать, можно упростить выше:

bw = false(M,N); 
bw(idxList = true; 
bw = imdilate(bw,SE); 
bw(idxList) = false; 
cc = bwconncomp(bw); 
neighbors = cc.PixelIdxList; 
+0

Спасибо за помощь. У меня есть больше чем 90k записей в массиве idx для обработки. Этот подход для петли очень дорог. Да, окрестности соседствуют. Есть ли какой-либо эффективный метод без обработки циклов для обработки всего списка idx менее чем за секунду? –

0

Вы можете сделать это с meshgrid и sub2ind

Предполагая, что целевой массив с именем T и индексных пунктов (m, n), где [m, n] = ind2sub(size(T), ind);

[X, Y] = meshgrid(m-5:m+5, n-5:n+5); 
I = sub2ind(size(T), X(:), Y(:)); 

Но если вы беспокоитесь о краях (вы должны быть), а затем использовать мин и макс следующим образом:

[M, N] = size(T); 
[X, Y] = meshgrid(max(1,m-5):min(M,m+5), max(1,n-5):min(N,n+5)); 
I = sub2ind(size(T), X(:), Y(:)); 

Также отметим, что это будет включать в себя центральную точку, но это легко удалить, найдя линейный индекс, используя sub2ind(size(T), m, n);

+0

спасибо за ваш код Dan! Я пытаюсь оптимизировать функцию, которая требует много времени для вычисления, и она основана на круговых окрестностях. Точнее, у меня разные круговые окрестности и внутри каждого из них, я хочу вычислить средние значения, std и медианные значения пикселей, лежащие в их основе. Это делается в контексте представления шкалы DoG. Размер кругового фильтра задается радиусом, связанным в определенном масштабе ('scalespace_radii'): http://pastebin.com/WkS5ShMf Приветствуется любое предложение о том, как улучшить вычисление! – Tin

+0

@Tin Пожалуйста, разместите это как новый вопрос – Dan

+0

спасибо Dan! Я разместил его уже как новый вопрос :-) http://stackoverflow.com/questions/21724404/matlab-optimizing-code-for-computing-statistics-in-multi-scale-circular-neighbo – Tin

Смежные вопросы