在 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度),最后在其中找到最大值。它可以工作,但我想可以有一个更快,更“清洁”的解决方案。
答案 0 :(得分: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
答案 1 :(得分:1)
以下是解决这个问题的一个相对便宜的解决方案,虽然我发现我的头围绕矩阵坐标系是一个真正的痛苦,并且可能有一些空间来整理它。它只是沿着提供角度的起点周围的线跟踪所有矩阵条目(所有坐标和角度当然都基于矩阵索引单位):
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