如何在MATLAB中的图像中找到局部最大值?
image-processing
matlab
14
0

我在MATLAB中有一张图片:

y = rgb2gray(imread('some_image_file.jpg'));

我想对其进行一些处理:

pic = some_processing(y);

并找到输出的局部最大值。也就是说, y中所有大于其所有邻居的点。

我似乎找不到MATLAB函数可以很好地做到这一点。我能想到的最好的是:

[dim_y,dim_x]=size(pic);
enlarged_pic=[zeros(1,dim_x+2);
              zeros(dim_y,1),pic,zeros(dim_y,1);
              zeros(1,dim_x+2)];

% now build a 3D array
% each plane will be the enlarged picture
% moved up,down,left or right,
% to all the diagonals, or not at all

[en_dim_y,en_dim_x]=size(enlarged_pic);

three_d(:,:,1)=enlarged_pic;
three_d(:,:,2)=[enlarged_pic(2:end,:);zeros(1,en_dim_x)];
three_d(:,:,3)=[zeros(1,en_dim_x);enlarged_pic(1:end-1,:)];
three_d(:,:,4)=[zeros(en_dim_y,1),enlarged_pic(:,1:end-1)];
three_d(:,:,5)=[enlarged_pic(:,2:end),zeros(en_dim_y,1)];
three_d(:,:,6)=[pic,zeros(dim_y,2);zeros(2,en_dim_x)];
three_d(:,:,7)=[zeros(2,en_dim_x);pic,zeros(dim_y,2)];
three_d(:,:,8)=[zeros(dim_y,2),pic;zeros(2,en_dim_x)];
three_d(:,:,9)=[zeros(2,en_dim_x);zeros(dim_y,2),pic];

然后查看沿第三维的最大值是否出现在第一层中(即: three_d(:,:,1) ):

(max_val, max_i) = max(three_d, 3);
result = find(max_i == 1);

还有其他更优雅的方法吗?这似乎有点不合时宜。

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

或者,只需使用出色的: extrema2.m

收藏
评论
bw = pic > imdilate(pic, [1 1 1; 1 0 1; 1 1 1]);
收藏
评论

除了imdilate ,这是在图像处理工具箱,你也可以使用ordfilt2

ordfilt2对本地邻ordfilt2值进行排序并选择第n个值。 ( MathWorks示例演示了如何实现max滤波器。)您还可以使用ordfilt2通过以下逻辑实现3x3峰查找器:

  1. 定义一个不包含中心像素 (8个像素)的3x3域。

     >> mask = ones(3); mask(5) = 0 % 3x3 max mask = 1 1 1 1 0 1 1 1 1 
  2. 使用ordfilt2选择最大(第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 
  3. 将此输出与每个邻域的中心值(仅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 
收藏
评论

或者,您可以使用nlfilter并提供自己的函数以应用于每个邻域。

“查找严格最大值”功能将简单地检查邻域的中心是否严格大于该邻域中的所有其他元素,为此,该元素始终为3x3。因此:

I = imread('tire.tif');
BW = nlfilter(I, [3 3], @(x) all(x(5) > x([1:4 6:9])) );
imshow(BW)
收藏
评论

如果您拥有Image Processing Toolbox ,则可以使用IMREGIONALMAX函数:

BW = imregionalmax(y);

变量BW将是一个与y大小相同的逻辑矩阵,其中1表示局部最大值,否则为0。

注意:正如您所指出的,IMREGIONALMAX将找到大于或等于其邻居的最大值。如果要排除具有相同值的相邻最大值(即查找单个像素的最大值),则可以使用BWCONNCOMP函数。以下应删除BW中具有任何邻居的点,仅保留单个像素:

CC = bwconncomp(BW);
for i = 1:CC.NumObjects,
  index = CC.PixelIdxList{i};
  if (numel(index) > 1),
    BW(index) = false;
  end
end
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题