Вычислить среднее значение и стандартное отклонение

Привет Перецветы,

У меня есть серая матрица изображения в MatLab и несколько конкретных координат пикселей этого изображения. Я хочу рассчитать среднее значение и стандартное отклонение значений в пределах прямоугольной области в этой матрице так, чтобы:

  1. он расположен под углом (например, 0, 45, 90, 135)
  2. он содержит все несколько пикселей
  3. его площадь минимальна для каждого угла, а его высота >= его ширине

На данный момент я был бы счастлив, если бы я мог сделать это для вертикального, горизонтального и обеих диагоналей, хотя я был бы очень признателен, если бы я мог сделать это для любого угла в руке.

Есть идеи ?


person geeko    schedule 30.12.2011    source источник


Ответы (1)


Итак, учитывая входной угол theta и группу координат points, вы хотите, чтобы минимальный охватывающий прямоугольник находился под этим углом (что это значит? -- ось высоты установлена ​​под этим углом? ось ширины? и угол от вертикали по часовой стрелке (как заголовки) или по горизонтали против часовой стрелки (как математика)?). Более того, мы настраиваем высоту так, чтобы она была >= ширины.

В этом случае я думаю, что следующее может сработать:

  1. Преобразуйте координаты в новую систему координат, которая представляет собой просто ось x-y, повернутую на угол 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 против i/j):

minClosingRect = calcMinEnclosingRect( pts, theta );
mean2( Img(minClosingRect) )
std2(  Img(minClosingRect) )
person mathematical.coffee    schedule 30.12.2011
comment
о, извините, я забыл, что вы хотите вычислить стандартное отклонение/среднее значение. Обновленный ответ: P - person mathematical.coffee; 31.12.2011