Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中找到图像中的局部极大值?_Matlab_Image Processing_Mathematical Optimization - Fatal编程技术网

如何在MATLAB中找到图像中的局部极大值?

如何在MATLAB中找到图像中的局部极大值?,matlab,image-processing,mathematical-optimization,Matlab,Image Processing,Mathematical Optimization,我在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

我在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)
):

有没有更优雅的方法?这似乎有点困难。

如果您有,您可以使用以下功能:

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

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

CC = bwconncomp(BW);
for i = 1:CC.NumObjects,
  index = CC.PixelIdxList{i};
  if (numel(index) > 1),
    BW(index) = false;
  end
end

或者,您可以使用并提供您自己的功能以应用于每个社区

“find strict max”函数只需检查邻域的中心是否严格大于该邻域中的所有其他元素,为此,该值始终为3x3。因此:

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

或者,只需使用优秀的:

除了图像处理工具箱中的
imdiplate
,您还可以使用
ordfilt2

>> 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
ordfilt2
对本地邻域中的值进行排序,并选择第n个值。(演示如何实现最大过滤器。)您还可以使用
ordfilt2
通过以下逻辑实现3x3峰值查找器:

  • 定义不包含中心像素(8像素)的3x3域

  • 使用
    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
    
  • 将此输出与每个邻域的中心值进行比较(仅
    A
    ):


  • 谢谢我看到Immax找到的最大值大于或等于他们的邻居。你知道我怎么才能只找到那些更大的而不等于他们邻居的吗?内森:那么,如果你要找到一组相邻的相等的最大值,你是想从中挑选一个,还是排除所有的最大值?哦。。。我修正了这个问题,以表明我在使用灰度。史蒂夫的回答确实更加优雅。@Dynamite:你可以先反转图像,使最小值变成最大值,然后使用与上面相同的方法。例如,如果你有一个无符号的8位整数图像,你可以用“255-y”将其反转。是的,这一个更快:)+1我忘记了imdeflate如何处理灰度图像(我通常只使用逻辑遮罩)。@Nathan:imdeflate对灰度图像的每个像素进行操作。3×3矩阵的中心位于每个像素处,并且像素值被在3×3矩阵中的值为1的相邻像素处发现的最大值替换。因此,调用imdeflate将返回一个新矩阵,其中每个点都被其8个相邻点的最大值替换(根据需要在边上填充零),原始矩阵较大的点表示局部极大值。<代码> Ididiase<代码>遍历每个像素并计算围绕它的相邻像素的最大值,并用掩码指定(注意中间的零以排除像素本身)。然后,我们将结果图像与原始图像进行比较,以检查每个像素是否严格大于其邻域的最大值。确保阅读有关形态学操作的文档页面:ImDigital似乎在图像处理工具箱中。有没有本地的matlab解决方案?相关问题:这是这里最正确的解决方案。它是在Matlab中生成的,计算时间比nfilter少得多。@Franzd'Anconia但我晚了5年才回答,所以它在底部。:)回答得很好。是否可以包括原始矩阵
    A
    ?您的处理链中似乎缺少此项。我可以很容易地对其进行反向工程,但最好能包含用于自我控制的内容:)。谢谢
    >> mask = ones(3); mask(5) = 0 % 3x3 max
    mask =
         1     1     1
         1     0     1
         1     1     1
    
    >> 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
    
    >> 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