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