Рассчитать среднее и стандартное отклонение - PullRequest
0 голосов
/ 30 декабря 2011

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

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

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

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

Есть идеи?

1 Ответ

3 голосов
/ 30 декабря 2011

Итак, учитывая входной угол 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) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...