在Matlab中将相对单元坐标转换为绝对矩阵坐标

时间:2014-01-24 15:08:04

标签: matlab image-processing matrix coordinate-systems

Matlab 中,我有一个大矩阵(512x512x100)。为了分析它,我使用了blockproc。由于blockproc只接受2D矩阵,我使用 mat2cell 和其他一些后续步骤将我的原始矩阵转换为2D矩阵。 blockproc函数搜索每个子矩阵中具有最高值的像素,并返回参考该子矩阵的坐标。

经过几个步骤后,我得到了第一个 mat2cell 转换参考的最大像素的坐标。现在我想将这些坐标转换为全局坐标,即大型原始3D矩阵中的绝对坐标。

我尝试过这个例子:

d =兰特(4,4,4)

d(:,:,1)=

0.0451    0.8044    0.0784    0.7859
0.8911    0.3481    0.4636    0.9806
0.4887    0.5677    0.0999    0.9488
0.7822    0.0467    0.5569    0.2256

d(:,:,2)=

0.8131    0.8880    0.8066    0.8103
0.8240    0.3358    0.8422    0.2552
0.8364    0.2759    0.3753    0.7741
0.9853    0.8297    0.3745    0.5936

d(:,:,3)=

0.1200    0.1841    0.3897    0.0894
0.0747    0.7485    0.4866    0.4722
0.8387    0.9523    0.0166    0.5013
0.8210    0.3107    0.6935    0.1286

d(:,:,4)=

0.6424    0.7322    0.4631    0.1684
0.5523    0.0953    0.0168    0.6231
0.1073    0.5530    0.8504    0.9304
0.3482    0.7804    0.7657    0.2496

在做完 mat2cell 后,我得到了:

cell(:,:,1)=

[2x2x2 double]    [2x2x2 double]
[2x2x2 double]    [2x2x2 double]

cell(:,:,2)=

[2x2x2 double]    [2x2x2 double]
[2x2x2 double]    [2x2x2 double]

这些是生成的坐标。下面矩阵的每一行代表每个"子单元格中最大像素的坐标":

max_px =

 2     1
 2     3
 2     2
 1     2
 2     2
 1     2
 2     4
 1     4

通过做"单元{1}(2,1)"你得到:

ans =

0.8911

是第一个3D子基数中的最大像素值(第一个"子单元")

我想这是将这些相对坐标转换为全局的非常简单的方法,但我不知道如何。提前谢谢。

2 个答案:

答案 0 :(得分:2)

你真的不必使用blockproc。我不知道为什么有人会......

  dcell=mat2cell(d,...);

  mask=cell2mat(  cellfun(@(c) eq(c,max(c(:))) , dcell, 'uni',0) ) ;

  [imax,jmax,kmax]=ind2sub(size(d), find(mask(:)));

这假设每个子阵列中都有一个唯一的最大值,您似乎也假定它。

答案 1 :(得分:0)

这使用您已有的max_px。第4行和第5行只是将max_px转换为更自然的3D坐标,因此可能会省略这些,并且代码会缩短,如果您可以以该形式开始使用它。

dcell=mat2cell(d,...);   


[outer_dims{1:3}]=size(dcell); outer_dims=[outer_dims{:}],
[inner_dims{1:3}]=size(dcell{1}); inner_dims=[inner_dims{:}],

idx=sub2ind(inner_dims,max_px(:,1),max_px(:,2));

[ii,jj,kk]= ind2sub(inner_dims,idx); %get 3-inner max coodinates


[X,Y,Z]=ndgrid(1:outer_dims(1),1:outer_dims(2), 1:outer_dims(3));

dims6=[inner_dims; outer_dims];

idx6=sub2ind(dims6(:).', ii,X(:),jj,Y(:),kk,Z(:));

 [imax,jmax,kmax]  = ind2sub(size(d),idx6);