【问题标题】:Find maximum pixel using BLOCKPROC in Matlab在 Matlab 中使用 BLOCKPROC 查找最大像素
【发布时间】:2014-02-13 20:09:27
【问题描述】:

Matlab 中,我有一个 3D 矩阵(超过 100 帧 512x512)。我的目标是通过整个超矩阵找到一些代表点。为此,我实现了传统的(而且效率不高)方法:我将大矩阵细分为更小的子矩阵,然后寻找具有最高值的像素。之后,我将子矩阵中该像素的相对坐标更改为参考大矩阵的全局坐标。

现在,我正在重新设计算法。我已经看到,为了逐块分析大型矩阵(这实际上是我使用旧算法所做的),BLOCKPROC 函数非常有效。我已经阅读了文档,但我不知道应该如何实现“有趣”功能来提取每个块中具有最高值的像素。提前谢谢你。

*我正在尝试获取参考全局矩阵的那些最大像素的坐标,我真的不在乎它们的值。

【问题讨论】:

  • 我不太确定你想要实现什么。为什么不对每一帧都使用 max() 函数?然后使用 find() 和 ind2sub()。就像在这个线程中一样:mathworks.com/matlabcentral/newsreader/view_thread/170759
  • 因为在每一帧中都有几个我正在寻找的点。解释太长了... 简要地说:我从显微镜中获得了图像(3D 堆栈),其中有许多纤维(胶原纤维)。我必须找到一些点(每帧中的几个像素),然后插入这些点并重建纤维。这些点称为成核点,找到它们的最佳方法是按照我在问题中解释的操作。
  • 我认为我想做的事情很简单。将图像细分为较小的图像,并获取每个较小图像的最大像素的坐标(参考全局图像)。
  • 如果您知道要查找的值,find() 函数将返回您要查找的所有点的索引。您甚至可以使用逻辑表达式。或者我可能误解了你所说的“最大值”是什么意思。 mathworks.com/help/matlab/ref/find.html
  • 确实如此。但是,同一子矩阵中的多个像素可以具有相同的值。

标签: algorithm matlab image-processing block


【解决方案1】:

首先定义一个函数来找到一个(子)矩阵的最大值的位置:

function loc = max_location(M);
[~, ii] = max(M(:));
[r c] = ind2sub(size(M),ii);
loc = [r c];

然后使用

blockproc(im, blocksize, @(x) x.location+max_location(x.data)-1)

其中im 是您的图像(2D 数组),blocksize 是指定块大小的 1x2 矢量。在blockproc 中,data 字段是子矩阵(您将其传递给max_location),location 字段包含子矩阵左上角的坐标(您将其添加到 @ 的结果中) 987654330@, 负 1)。

例子:

>> blocksize = [3 3];

>> im = [ 0.3724    0.0527    0.4177        0.6981    0.0326    0.4607
          0.1981    0.7379    0.9831        0.6665    0.5612    0.9816
          0.4897    0.2691    0.3015        0.1781    0.8819    0.1564

          0.3395    0.4228    0.7011        0.1280    0.6692    0.8555
          0.9516    0.5479    0.6663        0.9991    0.1904    0.6448
          0.9203    0.9427    0.5391        0.1711    0.3689    0.3763 ];

>> blockproc(im, blocksize, @(x) x.location+max_location(x.data)-1)

ans =
     2     3     2     6
     5     1     5     4

表示您的块最大值位于坐标 (2,3)、(5,1)、(2,6) 和 (5,4)

【讨论】:

  • 哇!!非常感谢!
  • 如何将此算法应用于多维矩阵 (x,y,z),而不仅仅是单帧? (我想要一个块大小 [3 3 3])
  • blockproc 据我所知仅适用于 2D。您也许可以将 3D 数组重塑为 2D 数组,然后您可以申请 blockproc
  • 这是由 Dr. Ramón Casero(牛津大学)实现的解决方案(使用 3D 数组实现 blockproc):code.google.com/p/gerardus/source/browse/trunk/matlab/…
【解决方案2】:

函数句柄“fun”的棘手之处在于它引用了作为结构的子块,这是一个具有一个或多个字段的对象,并且每个字段都有一个或多个值。

子块的值存储在一个名为“数据”的字段中,因此函数调用

@(x)max(x)

还不够,在这种情况下正确的版本是

@(x)max(x.data)

您正在寻找的 2D 示例如下所示:

a=magic(4);

b=blockproc(a,[2,2],@(x) find(x.data==max(max(x.data)))); %linear indexes

输出

a =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1


b =

     1     3
     4     2

b是每个子块的线性索引,所以a中的值是16、13、14、15。

希望有帮助!

【讨论】:

    【解决方案3】:

    另一种可能性是对每一帧使用im2col。如果I 是你的框架(512,512):

    % rearranges 512 x 512 image into 4096 x 64
    % each column of I2 represents a 64 x 64 block 
    n = 64;
    I2 = im2col(I,[n,n],'distinct'); 
    
    % find max in each block
    % ~ to ignore that output
    [~,y] = max(I2);
    
    % convert those values to overall indices
    ind = sub2ind(size(I2),y, 1:n);
    
    % create new matrix
    I3 = zeros(size(I2));
    I3(ind)=1;
    I3 = col2im(I3,[n,n],size(I),'distinct');
    

    I3 现在应该是与输入I 相同大小的图像,但除了每个子矩阵中的最大点的位置外,全为零。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多