Matlab - 在邻域中应用函数
Matlab - Applying a function in a neighborhood
假设我有一个 250*250 矩阵。我想要做的是 select 每个像素周围的 [3 3] 邻域并对其应用一个函数。现在的问题是,该函数将为邻域中的每个像素输出一个 2*2 矩阵,然后我必须将每个像素的结果相加,最后得到 selected 像素的 2*2 矩阵。所以最后我会得到62500个2*2的矩阵。另外,我必须为 250*250 单元格中的每个像素保存 2*2 矩阵。因为这些矩阵将用于进一步的计算。所以不知道我是怎么做到的,因为我不能使用 nfilter 或 colfilt,因为在那些函数中,函数必须 return 一个标量。非常欢迎任何意见或建议。
这是一种执行此操作的模式:
% 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);
您可以将 nlfilter
与 returns 一个单元格的函数一起使用,这样结果将是一个单元格矩阵。:
a = rand(10);
result = nlfilter(a,[3 3],@(x){x(1:2,1:2)});
假设我有一个 250*250 矩阵。我想要做的是 select 每个像素周围的 [3 3] 邻域并对其应用一个函数。现在的问题是,该函数将为邻域中的每个像素输出一个 2*2 矩阵,然后我必须将每个像素的结果相加,最后得到 selected 像素的 2*2 矩阵。所以最后我会得到62500个2*2的矩阵。另外,我必须为 250*250 单元格中的每个像素保存 2*2 矩阵。因为这些矩阵将用于进一步的计算。所以不知道我是怎么做到的,因为我不能使用 nfilter 或 colfilt,因为在那些函数中,函数必须 return 一个标量。非常欢迎任何意见或建议。
这是一种执行此操作的模式:
% 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);
您可以将 nlfilter
与 returns 一个单元格的函数一起使用,这样结果将是一个单元格矩阵。:
a = rand(10);
result = nlfilter(a,[3 3],@(x){x(1:2,1:2)});