Matlab - перемещение окна, избегая вложенных циклов - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь написать «взвешенное движущееся окно» без вложенных циклов для улучшения скорости.Я уже пытался использовать arrayfun без получения впечатляющих результатов, но, возможно, я сделал это неправильно.

Окно имеет различный вес в каждой позиции (хранится в B) и должно быть наложено на матрицу A, возвращающуюзначения матрицы A, которые лежат внутри окна, умножают вес окна в этой позиции (считайте из B).Кроме того, окна могут перекрывать одно на другое, и в этом случае максимальное значение должно быть сохранено.Наконец, размер и смещение окна должны быть параметрами функции.

На самом деле это выглядит сложнее, поэтому я покажу вам код, который я хотел бы улучшить:

A = reshape([1:35],7,5)';   % values matrix
B = [1:3;4:6];              % window s weight matrix

% matrices size
[m n] = size(A);
[a b] = size(B);

% window s parameters
shift = 2;                  % window s movement at each iteration
zone = 3;                   % window s size (zone x zone)

% preallocation
C = ones(m,n);              % to store the right weight to be applied in each position

% loop through positions and find the best weight when they overlap
for i=1:m
    for j=1:n
       C(i,j) = max(max(B( max(round((i-zone)/shift)+1,1) : min(ceil(i/shift),a) , max(round((j-zone)/shift)+1,1) : min(ceil(j/shift),b))));
    end
end

% find the output of the windows
result = C.*A;

Iнадеюсь, что я дал понять, но если вам нужно больше деталей, пожалуйста, спросите.Заранее благодарю за помощь!

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Если у вас есть доступ к панели инструментов обработки изображений, вам нужно проверить, как выполнять операции скользящей окрестности .В частности, я думаю, что функция NLFILTER может использоваться для достижения желаемого результата:

A = reshape([1:35],7,5)';  %'# Matrix to be filtered
B = [1:3;4:6];              %# Window weights
result = nlfilter(A,[2 3],@(M) max(M(:).*B(:)));
1 голос
/ 14 сентября 2012

Попробуйте filter.

Например, для создания оконного среднего по 5 элементам:

outdata = filter([ 0.2 0.2 0.2 0.2 0.2 ], 1, indata);
1 голос
/ 28 марта 2011

Я бы использовал im2col. Предполагая, что ваше изображение jxk, а ваше окно mxn, вы получите матрицу mn x (j-m + 1) * (k-n + 1 ). Затем вы можете просто взять все остальные столбцы.

Пример кода:

%A = your_image
B = im2col(A, [m n],'sliding');
C = B(:,1:2:end);

А вот ваше скользящее окно с "смещением 2".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...