我在矩阵(A)9 * 9中遇到问题,我需要为每个块3 * 3提取中值。 另外,我需要知道每个区块中位数的位置。
注意: 我知道如何通过使用提取中位数 M =中值(中值(B)); B是矩阵块 B = A(i:i + L-1,j:j + L-1);
谢谢。答案 0 :(得分:1)
如果您安装了图像处理工具箱,则可以使用:
medianBlocks = blockproc(A,[3,3],@(X) ones(size(X.data))*median(X.data(:)))
A == medianBlocks
答案 1 :(得分:0)
如果您没有图像处理工具箱,我建议转换每个邻域以使其适合单个列,然后将所有这些列堆叠在一起以创建单个矩阵。获得此新矩阵后,找到每列的中位数,然后使用此结果进行进一步处理。
执行此操作的最佳方法是使用im2col
创建此临时矩阵,并在列上对此矩阵执行中位数。输出将为您提供图像中每个邻域的中位数。
具有讽刺意味的是,im2col
是图像处理工具箱的一部分。但是,Divakar已经制作了一个矢量化且更有效的版本,它不需要工具箱,只依赖于本机MATLAB命令。
见这里:Efficient Implementation of `im2col` and `col2im`
因此,根据您是否需要重叠块或滑块,请使用适合您的命令。因此:
out = im2col_distinct(A, [3 3]); %//OR
%out = im2col_sliding(A, [3 3]);
out_median = median(out);
out_median
将包含一个向量,该向量具有图像中每个块的中值。现在,如果您想要查找每个窗口中的哪个位置具有中位数,您可以进行bsxfun
调用:
loc = bsxfun(@eq, out, out_median);
loc
将包含每个块的列主要位置。如果您想要关于每个块的行和列位置,可以使用ind2sub
:
[rows,cols] = ind2sub([3 3], loc);
rows
和cols
将为您提供中位数位于图像每个区域附近的行和列位置。