0

我对matlab很陌生,如果这是一个愚蠢的问题,我很抱歉。我必须遵循矩阵:

im = imread('image.jpg');  %<370x366 double>
[y,x] = find(im); %x & y both <1280x1 double>
theta;  %<370x366 double> computed from gradient of image

我目前可以像这样一次绘制一个点:

plot(x(502) + 120*cos(theta(y(502),x(502))),y(502) + 120*sin(theta(y(502),x(502))));

但是我想做的是如何增加一个累加器数组,我想在每次找到该位置的值时将 acc 的位置增加 1。

所以如果 x(502) + 120*cos(theta(y(502),x(502))),y(502) + 120*sin(theta(y(502),x(502)) = (10, 10) 然后 acc(10,10) 应该增加 1。我正在处理一个非常大的数据集,所以我想避免 for-loops 并使用这样的东西:

acc = zeros(size(im));
%increment value when point lands in that location
acc(y,x) = acc(x + 120*cos(theta(y,x)),y + 120*sin(theta(y,x)),'*b')) + 1;

如果 120 实际上也可以是另一个包含不同半径值的矩阵,那就太好了。

4

2 回答 2

1

i = find(im);

代替

[y,x] = find(im)

这将为您提供非零值的线性索引

另外,创建一个网格

[x,y] = meshgrid(1:366,1:370)

现在您可以对坐标和值进行线性索引,例如

x(520)是第 520 个点 x 坐标

im(520)为第 520 点灰度值

theta(520)是第 520 个梯度值

所以,现在你可以绘制它:

plot(x(i) + 120*cos(theta(i)),y(i) + 120*sin(theta(i)),'b*');

x(i)表示一列第 i 个值

x(i) + 120*cos(theta(i))表示一列结果

积累

我认为在这种情况下循环累积是可以的:

acc=zeros(size(im));
for ii=1:length(i)
    xx=round(x(ii) + 120*cos(theta(ii)));
    yy=round(y(ii) + 120*sin(theta(ii)));
    acc(xx,yy)=acc(xx,yy)+1;
end;
于 2012-12-02T17:53:14.933 回答
1

(示例中的factor120)可以是大小为的矩阵im或标量。.*会做的。

im = imread('image.jpg');
[y, x] = meshgrid(1 : size(im, 1), 1 : size(im, 2));
factor = 120 * ones(size(im)); 
theta = gradient(double(image)); % just for example

acc = zeros(size(im));

increment = ((x + factor .* cos(theta)) == 10) &  ((y + factor .* sin(theta)) == 10);
acc = acc + increment;

但是比较10很少是真的,所以你需要允许一些范围。例如(9,11).

e = 1;
increment = abs((x + factor .* cos(theta)) - 10) < e &  abs((y + factor .* sin(theta)) - 10) < e;
于 2012-12-02T18:58:57.393 回答