Matlab — применение функции в окрестности

Допустим, у меня есть матрица 250*250. Что я хочу сделать, так это выбрать окрестности [3 3] вокруг каждого пикселя и применить к нему функцию. Теперь проблема в том, что функция будет выводить матрицу 2*2 для каждого пикселя в окрестности, а затем мне нужно добавить результат каждого пикселя и, наконец, получить матрицу 2*2 для выбранного пикселя. Так что в итоге я получу 62500 матриц 2*2. Кроме того, я должен сохранить матрицу 2 * 2 для каждого пикселя в ячейке 250 * 250. Потому что эти матрицы будут использоваться для дальнейших расчетов. Итак, любая идея, как я это делаю, потому что я не могу использовать nfilter или colfilt, потому что в них функция должна возвращать скаляр. Любые советы или предложения приветствуются.


person Frank wiene    schedule 02.03.2018    source источник
comment
если ни одна из стандартных функций не подходит, почему бы просто не написать свою?   -  person Piglet    schedule 02.03.2018
comment
Зациклиться на x, зациклиться на y, применить функцию к пикселю.   -  person Cris Luengo    schedule 02.03.2018


Ответы (2)


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

a = rand(10);
result = nlfilter(a,[3 3],@(x){x(1:2,1:2)});
person rahnema1    schedule 02.03.2018

Вот один из шаблонов того, как это сделать:

% define matrix
N = 250; % dimensionality
M = rand(N); % random square N-by-N matrix

% initialize output cell array
C = cell(N);

% apply the function (assume the function is called your_function)
for row = 1 : N
    for col = 1 : N

        % determine a 3x3 neighborhood (if on edge of matrix, 2x2)
        row_index = max(1, row - 1) : min(N, row + 1);
        col_index = max(1, col - 1) : min(N, col + 1);
        neighborhood = mat(row_index, col_index);

        % apply the function and save to cell
        C{row, col} = your_function(neighborhood);

    end
end

А вот простой пример your_function, чтобы вы могли протестировать приведенный выше код:

function mat = your_function(mat)
S = size(mat);
if S(1) < 2 || S(2) < 2, error('Bad input'); end
mat = mat(1:2, 1:2);
person verbatross    schedule 02.03.2018