【问题标题】:Find Value at a given Orientation in Matrix在矩阵中的给定方向查找值
【发布时间】:2013-08-07 23:08:24
【问题描述】:

Matlab 中,我有一个矩阵,在我的代码的前一阶段,选择了一个特定元素。从矩阵的这一点开始,我想找到一个最大值,而不仅仅是给定半径的所有周围邻居之间的最大值,而是 在给定方向角度的最大值。让我用一个例子来解释一下:

这是矩阵 A:

A =

 0     1     1     1     0     0     9     1     0     
 0     2     2     4     3     2     8     1     0     
 0     2     2     3     3     2     2     1     0     
 0     1     1     3     2     2     2     1     0     
 0     8     2     3     3     2     7     2     1    
 0     1     1     2     3     2     3     2     1     

第一阶段选择的元素是A(2,4)中的4,下一个元素应该是最大值,例如315度的方向角,即是 A(5,7) 中的 7

我所做的是,根据角度,将矩阵 A 细分为不同的象限,并创建一个仅包含该象限值的新矩阵(A 的子矩阵)。

因此,对于本例,子矩阵将是 A 的第四象限:

q_A =

 4     3     2     8     1     0     
 3     3     2     2     1     0     
 3     2     2     2     1     0     
 3     3     2     7     2     1     
 2     3     2     3     2     1     

现在,我的问题是,如何提取 7

我唯一能做的(并且有效)是找到所有超过阈值的值,然后计算这些点的方向。然后,保存与给定方向(本例中为 315 度)具有相似方向的所有值,最后找到其中的最大值。它有效,但我想可能会有更快、更“清洁”的解决方案。

【问题讨论】:

  • 您是否尝试过imrotate 使用最近邻插值和您的元素 (r,c) 作为中心来使您的角度始终为 0?然后就是max(Arotated(r,c:end))

标签: matlab image-processing matrix


【解决方案1】:

这是我的理论,但我没有图像处理工具箱来测试它。也许有人可以发表评论?

%make (r,c) the center by padding with zeros
    if r > size(A,1)/2
        At = padarray(A, [size(A,1) - r], 0, 'pre');
    else
        At = padarray(A, [r-1], 0 'post');

    if c > size(A,2)/2
        At = padarray(At, [size(A,2) - c], 0, 'pre');
    else
        At = padarray(At, [c-1], 0 'post');

%rotate by your angle (maybe this should be -angle or else 360-angle or 2*pi-angle, I'm not sure
    Ar = imrotate(At,angle, 'nearest', 'loose'); %though I think nearest and loose are defaults

%find the max

    max(Ar(size(Ar,1)/2, size(Ar,2)/2:end); %Obviously you must adjust this to handle the case of odd dimension sizes.

另外根据您的阵列要求,使用-inf 填充可能比0 更好

【讨论】:

  • 旋转...听起来不错!我会试试看。但是,我的问题是,我正在寻找的值应该在给定的角度附近。也许,通过在给定角度上方和下方的几个角度执行您建议的操作,可能会起作用。谢谢!
  • @karl71 但是就像我说的那样,我没有工具箱来测试这些,所以我建议你运行每一行并检查输出以确保它有意义。特别是因为它很容易被关闭一行/列等。
【解决方案2】:

以下是该问题的相对便宜的解决方案,尽管我发现在矩阵坐标系周围缠绕我的头真的很痛苦,并且可能有一些空间来整理它。它只是以提供的角度沿着起点周围的一条线跟踪所有矩阵条目(所有坐标和角度当然基于矩阵索引单位):

A = [ 0     1     1     1     0     0     9     1     0
      0     2     2     4     3     2     8     1     0
      0     2     2     3     3     2     2     1     0
      0     1     1     3     2     2     2     1     0
      0     8     2     3     3     2     7     2     1
      0     1     1     2     3     2     3     2     1 ];
alph = 315;
r = 2;
c = 4;
% generate a line through point (r,c) with angle alph
[nr nc] = size(A);
x = [1:0.1:nc]; % overkill
m = tan(alph);
b = r-m*c;
y = m*x + b;
crd = unique(round([y(:) x(:)]),'rows');
iok = find((crd(:,1)>0) & (crd(:,1)<=nr) & (crd(:,2)>0) & (crd(:,2)<=nc));
crd = crd(iok,:);
indx=sub2ind([nr,nc],crd(:,1),crd(:,2));
% find max and position of max
[val iv]=max(A(indx)); % <-- val is the value of the max
crd(iv,:)             % <-- matrix coordinates (row, column) of max value

结果:

val =

     7


iv =

     8


ans =

     5     7

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多