计算平均值和标准差

时间:2011-12-30 09:22:46

标签: matlab graphics raster standard-deviation

问候Overflowers,

我在MatLab中有一个灰色图像矩阵,并且该图像的特定像素坐标很少。 我想计算该矩阵中矩形区域内的值的平均值和标准差,以便:

  1. 它以一定角度(例如0°,45°,90°,135°)
  2. 定位
  3. 它包含所有少数像素
  4. 每个角度的面积最小,其高度> =宽度
  5. 现在,如果我可以为垂直,水平和两个对角线情况做这件事,我会很高兴,但我真的很感激,如果我可以在任何角度做到这一点。

    有什么想法吗?

1 个答案:

答案 0 :(得分:3)

因此,给定输入角度theta和一堆坐标points,您希望该角度处的最小包围矩形(这意味着什么? - 高度轴设置为该角度?宽度轴?从垂直 - 顺时针(如标题)或水平 - 逆时针(如数学)?)的角度。 此外,我们调整高度,使其> =宽度。

在这种情况下,我认为以下内容可能有效:

  1. 将坐标转换为新的坐标系,该坐标系只是按角度theta旋转的x-y轴(使用旋转矩阵)
  2. 在此坐标系中找到最小的包围矩形:现在只是在水平 - 垂直维度中找到最小的包围矩形(因此我们不再需要担心theta因为我们已经转换了坐标)
  3. 确保最小封闭矩形的高度为> = width
  4. 将矩形转换回原始坐标系(按theta向后旋转)。
  5. 使用这些坐标计算mean / stddev。
  6. 这样的事情可以起作用(未经测试),调整你的愿望:

    % pts is 2xn
    % theta is in degrees, anticlockwise from horizontal.
    % returns 2xn matrix of indices into the min enclosing rectangle.
    function minClosingRect = calcMinEnclosingRect( pts, theta )
        % convert to radians and rotate by theta degrees ANTICLOCKWISE
        thRad  = theta*pi/180;
        rotMat = [ cos(thRad) -sin(thRad); sin(thRad) cos(thRad) ];
    
        ptsRot = rotMat * pts;
    
        % find minimum enclosing rectangle of ptsRot
        %  in the horizontal-vertical direction
        % this is just min/max coords.
        minX = min(ptsRot(1,:));
        maxX = min(ptsRot(1,:));
        minY = min(ptsRot(2,:));
        maxY = max(ptsRot(2,:));
    
        % make sure height >= width
        if (maxY-minY)<(maxX-minX)
            % NOTE: depending on how you want you can extend
            % - out the bottom
            % - the top
            % - centred (etc)
            % e.g. to make the rectangle taller out the bottom
            minY = maxY - (maxX-minX);
        end
    
        % construct indices into rectangle
        [X Y] = meshgrid( minX:maxX, minY:maxY )
    
    
        % convert indices back by rotating thRad degrees backwards.
        rotMatInv = [ cos(-thRad) -sin(-thRad); sin(-thRad) cos(-thRad) ];
        minClosingRect = rotMatInv * [X(:) Y(:)]';
    

    然后像这样使用它(一个警告是X / Y vs i / j):

    minClosingRect = calcMinEnclosingRect( pts, theta );
    mean2( Img(minClosingRect) )
    std2(  Img(minClosingRect) )