如何在图像中找到局部最大值

som*_*one 5 matlab local feature-detection

问题是关于特征检测的概念。找到图像的角点后卡住了,我想知道如何在计算的角点内找到特征点。

假设我有像这样的数据的灰度图像

A = [ 1 1 1 1 1 1 1 1;
      1 3 3 3 1 1 4 1;
      1 3 5 3 1 4 4 4;
      1 3 3 3 1 4 4 4; 
      1 1 1 1 1 4 6 4;
      1 1 1 1 1 4 4 4]
Run Code Online (Sandbox Code Playgroud)

如果我用

B = imregionalmax(A);
Run Code Online (Sandbox Code Playgroud)

结果将是这样

B = [ 0 0 0 0 0 0 0 0;
      0 1 1 1 0 0 1 0;
      0 1 1 1 0 1 1 1;
      0 1 1 1 0 1 1 1;
      0 0 0 0 0 1 1 1;
      0 0 0 0 0 1 1 1]
Run Code Online (Sandbox Code Playgroud)

问题是如何在最大局部区域内选择最高峰(在示例中,我是如何从3中选择5并从4中选择6)?

我的想法是使用B来检测每个区域并imregionalmax()再次使用,但是我不太擅长编码,因此我需要一些建议或其他想法。

cha*_*pjc 6

还有两种其他简便的方法可以实现2D峰值查找器:ordfilt2imdilate

ordfilt2

最直接的方法是使用ordfilt2,它对本地邻域中的值进行排序并选择第n个值。(MathWorks示例演示了如何实现最大滤波器。)您还可以通过以下方式实现3x3峰值查找器:ordfilt2(1)使用不包含中心像素的3x3域,(2)选择最大(第8个)值,然后(3)与中心值比较:

>> mask = ones(3); mask(5) = 0 % 3x3 max
mask =
     1     1     1
     1     0     1
     1     1     1
Run Code Online (Sandbox Code Playgroud)

此掩码中考虑了8个值,因此第8个值是最大值。过滤器输出:

>> B = ordfilt2(A,8,mask)
B =
     3     3     3     3     3     4     4     4
     3     5     5     5     4     4     4     4
     3     5     3     5     4     4     4     4
     3     5     5     5     4     6     6     6
     3     3     3     3     4     6     4     6
     1     1     1     1     4     6     6     6
Run Code Online (Sandbox Code Playgroud)

诀窍是将其与A,每个邻域的中心值进行比较:

>> peaks = A > B
peaks =
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     1     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     1     0
     0     0     0     0     0     0     0     0
Run Code Online (Sandbox Code Playgroud)

imdilate

图像膨胀通常是在二进制图像进行,但灰度图像扩张是一个简单的最大滤波器(见定义部分imdilate文档)。ordfilt2此处使用与之相同的技巧:定义不包含中心邻域像素的邻域,应用滤镜并将其与未滤镜的图像进行比较:

B = imdilate(A, mask);
peaks = A > B;
Run Code Online (Sandbox Code Playgroud)

注意:这些方法只能找到一个像素峰值。如果任何邻居的值相同,则不会是峰值。