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

現在、次のように一度に1つずつポイントをプロットできます。

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ループを避け、次のようなものを使用します。

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)

wthisは、ゼロ以外の値の線形インデックスを提供します

また、メッシュグリッドを作成します

[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

factor例では120)は、サイズの行列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 に答える