0

问候溢出者,

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

  1. 它以一个角度定位(例如 0、45、90、135)
  2. 它包含所有几个像素
  3. 它的面积对于每个角度都是最小的,它的高度 >= 它的宽度

现在,如果我能在垂直、水平和双对角线的情况下这样做,我会很高兴,但如果我能在手头的任何角度做到这一点,我将非常感激。

有任何想法吗 ?

4

1 回答 1

3

所以,给定输入 angletheta和一堆坐标points,你想要那个角度的最小封闭矩形(这是什么意思?- 高度轴设置在那个角度?宽度轴?和垂直顺时针方向的角度(比如标题)或水平逆时针(如数学)?)。此外,我们调整高度,使其 >= 宽度。

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

  1. 将坐标转换为一个新的坐标系,该坐标系只是按角度旋转的 xy 轴theta(为此使用旋转矩阵)
  2. 在这个坐标系中找到最小的封闭矩形:现在只是在水平垂直维度上找到最小的封闭矩形(所以我们不需要再担心了,theta因为我们已经转换了坐标)
  3. 确保最小封闭矩形的高度 >= 宽度
  4. 将矩形转换回原始坐标系(将其旋转回theta)。
  5. 使用这些坐标来计算平均值/标准差。

像这样的东西可以工作(未经测试),调整你的愿望:

% 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) )
于 2011-12-30T11:15:05.157 回答