我对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循环并使用这样的东西:
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实际上是另一个包含不同半径值的矩阵,那将是很好的。
答案 0 :(得分:1)
做
i = find(im);
而不是
[y,x] = find(im)
wthis将为您提供非零值的线性指标
另外,创建一个meshgrid
[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;
答案 1 :(得分: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;