如果您有图像处理工具箱,可以使用形态学膨胀来查找局部极值并抑制所有其他元素。
array = magic(6); %# make some data
msk = [0 1 0;1 0 1;0 1 0]; %# make a 4-neighbour mask
%# dilation will replace the center pixel with the
%# maximum of its neighbors
maxNeighbour = imdilate(array,msk);
%# set pix to zero if less than neighbors
array(array<maxNeighbour) = 0;
array =
35 0 0 26 0 0
0 32 0 0 0 25
31 0 0 0 27 0
0 0 0 0 0 0
30 0 34 0 0 16
0 36 0 0 18 0
编辑使用与@gnovice相同的数据,并修复代码
其中一种方法是使用图像处理工具箱中的NLFILTER函数,该函数将给定的函数应用于矩阵的每个M×N块:
>> A = magic(6) %# A sample matrix
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
>> B = nlfilter(A,[3 3],@(b) b(5)*all(b(5) >= b([2 4 6 8])))
B =
35 0 0 26 0 0
0 32 0 0 0 25
31 0 0 0 27 0
0 0 0 0 0 0
30 0 34 0 0 16
0 36 0 0 18 0
上面的代码定义了一个匿名函数,它使用线性索引来获取3x3子矩阵b(5)
的中心元素,并将其与其4个相邻元素b([2 4 6 8])
进行比较。中心元素中的值乘以函数ALL返回的逻辑结果,当中心元素大于所有最近的邻居时,该结果为1,否则为0。
B = nlfilter(A,[3 3],@(b) b(5)*(0<sum(b([2 4 6 8])) && sum(b([2 4 6 8]))<4));
,它可以正常工作。非常感谢! - bordart>> B = zeros(sizeA); B(indexKeep) = A(indexKeep) B = 254 0 0 0 0 124 0 191 0
将这些内容包装成一个函数并在1000个随机的100x100矩阵上进行测试后,该算法似乎非常快:
>> tic; for ii = 1:1000 A = randi(255, 100); B = test(A); end; toc 经过时间为0.861121秒。
index = A2>=circshift(A2,[0 1]) & A2>=circshift(A2,[0 -1]) & A2>=circshift(A2,[1 0]) & A2>=circshift(A2,[-1 0]); A2 = A2.*index; A2 = A2(2:end-1,2:end-1);
另外,我认为你想使用>=
而不是>
。 - gnovice