在图像中获取向量的所有像素坐标

4
我有一张灰度图像,选中其中一个像素点。我希望在该像素点出发,向所有方向/角度发送向量,并对所有向量接触的像素强度进行求和。
此步骤完成后,我想画出一个直方图,其中一个轴是强度,另一个轴是角度。我认为我可以独立完成最后一步,但我不知道如何在我的灰度图像中创建这些向量以及如何获取向量接触的像素的坐标。
之前我用C++实现过,需要大量代码。我相信在MATLAB中可以用更少的代码实现,但我对MATLAB还比较陌生,所以任何帮助都将不胜感激,因为我在文档中未找到任何有用的信息。
2个回答

5

这可能不是解决问题的最佳方法,但你可以使用一些代数方法来解决,以下是具体步骤...
我们知道通过点(a,b)和角度theta的直线的点斜式公式如下:

y = tan(theta) * (x-a) + b

因此,一个简单的想法是计算该直线与y=const的交点,然后读取交点处的强度值。您需要为所有角度重复此操作...
以下是用于说明该概念的示例代码:
%% input
point = [128 128];               % pixel location
I = imread('cameraman.tif');     % sample grayscale image

%% calculations
[r c] = size(I);
angles = linspace(0, 2*pi, 4) + rand;
angles(end) = [];
clr = lines( length(angles) );   % get some colors

figure(1), imshow(I), hold on
figure(2), hold on

for i=1:length(angles)
    % line equation
    f = @(x) tan(angles(i))*(x-point(1)) + point(2);

    % get intensities along line
    x = 1:c;
    y = round(f(x));
    idx = ( y<1 | y>r );        % indices of outside intersections
    vals = diag(I(x(~idx), y(~idx)));

    figure(1), plot(x, y, 'Color', clr(i,:))    % plot line
    figure(2), plot(vals, 'Color', clr(i,:))    % plot profile
end
hold off

嗨,Amro!昨晚我写了一些非常相似的东西,使用“布雷森汉姆算法”而不是四舍五入(y=round(f(x)))。多亏了你的代码,我找到了我的代码中的错误。非常感谢!! - zhengtonic
实际上,四舍五入只是一个快速修复的方法。您可以通过沿着线插值强度值来改进这种“探测”技术。 - Amro

3
这个例子类似于Amro's,但它是一种稍微不同的实现,适用于分配给图像的任意坐标系...
假设您有矩阵,这些矩阵包含与图像大小相同的定期间隔的x和y坐标,以便像素(i,j)的坐标由(x(i,j),y(i,j))给出。例如,我将使用MESHGRID创建一个5乘5的整数坐标样本集:
>> [xGrid,yGrid] = meshgrid(1:5)

xGrid =

     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5
     1     2     3     4     5

yGrid =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

接下来,我们可以定义一条线 y = m*(x - a) + b,通过选择一些常量的值并使用网格的x坐标计算y,穿过坐标系:

>> a = 0;
>> b = 1;
>> m = rand

m =

    0.5469

>> y = m.*(xGrid(1,:)-a)+b

y =

    1.5469    2.0938    2.6406    3.1875    3.7344

最后,我们在网格中找到与上面计算的点相差不超过网格大小的y坐标点:
>> index = abs(yGrid-repmat(y,size(yGrid,1),1)) <= yGrid(2,1)-yGrid(1,1)

index =

     1     0     0     0     0
     1     1     1     0     0
     0     1     1     1     1
     0     0     0     1     1
     0     0     0     0     0

使用此索引矩阵获取被线穿过的像素的x和y坐标:
>> xCrossed = xGrid(index);
>> yCrossed = yGrid(index);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接