中位数块的位置

时间:2015-02-28 16:57:16

标签: matlab image-processing

我在矩阵(A)9 * 9中遇到问题,我需要为每个块3 * 3提取中值。 另外,我需要知道每个区块中位数的位置。

注意: 我知道如何通过使用提取中位数 M =中值(中值(B)); B是矩阵块 B = A(i:i + L-1,j:j + L-1);

谢谢。

2 个答案:

答案 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);

rowscols将为您提供中位数位于图像每个区域附近的行和列位置。