在Matlab中使用BLOCKPROC查找最大像素

时间:2014-01-23 10:28:24

标签: algorithm matlab image-processing block

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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字段包含子矩阵左上角的坐标(您添加到max_location的结果,减去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)

答案 1 :(得分:1)

另一种可能性是每帧使用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大小相同的图像,但除了每个子矩阵中最大点的位置之外全部为零。

答案 2 :(得分:0)

函数句柄“fun”的棘手部分是它指的是作为结构的子块,这是一个具有一个或多个字段的对象,并且每个字段都有一个或多个值。

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

@(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。

希望有所帮助!