【问题标题】:Getting all pixel coordinates of a vector inside a image获取图像内向量的所有像素坐标
【发布时间】:2010-11-28 14:09:39
【问题描述】:

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

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

我以前在 C++ 中做过这个,这需要很多代码。我确信这可以在 MATLAB 中用更少的精力来完成,但我对 MATLAB 还是很陌生,所以任何帮助都将不胜感激,因为我在文档中没有发现任何有用的东西。

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    这可能不是解决问题的最佳方法,但您可以使用一些代数来解决,方法如下...
    我们知道通过点 (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
    

    【讨论】:

    • 嗨阿姆罗!我昨天晚上写了一些非常相似的东西,使用“bresenham 算法”而不是四舍五入( y=round(f(x)) )。感谢您的代码,我在代码中发现了错误。非常感谢!!
    • 确实,四舍五入只是一种快速解决方法。您可以通过沿线插入强度值来改进这种“探测”技术
    【解决方案2】:

    这个例子类似于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 来定义一条穿过坐标系的线 y = m*(x - a) + b

    >> 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2021-05-31
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多