获取图像内矢量的所有像素坐标

时间:2009-09-15 19:35:04

标签: matlab image-processing

我有一个强度/灰度图像,我在这个图像中选择了一个像素。我想在所有方向/角度上从这个像素开始向量发送矢量,并且我想要为所有向量求和触摸一个向量的像素的所有强度。

在此步骤之后,我想绘制一个直方图,其中一个轴上的强度和另一个轴上的角度。我想我可以自己完成最后一步,但我不知道如何在我的灰度图像中创建这些矢量以及如何获得矢量触摸的像素坐标。

我之前在C ++中做过这个,需要很多代码。我相信这可以在MATLAB中用更少的工作完成,但我对MATLAB很新,所以任何帮助都会受到赞赏,因为我没有在文档中找到任何有用的东西。

2 个答案:

答案 0 :(得分:4)

这可能不是解决问题的最佳方法,但是你可以用一些代数来做,下面是怎么... 我们知道通过点(a,b)的一条线的Point-Slope formula,角度θ是:

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

因此,一个简单的想法是为所有const计算此线与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

答案 1 :(得分: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

接下来,我们可以通过选择常量的某些值并使用网格的x坐标计算y = m*(x - a) + b来定义通过坐标系的行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);