@Gryphon88

Как определить наклон квадрата с известной стороной по его Bounding Box?

Здравствуйте,
на изображении есть квадраты с известной длиной стороны, мне нужно узнать наклон относительно оси Х. Функция MATLAB regionprops возвращает выровненные по осям Bounding Box. Как я рассуждал:
Пусть ширина boundingbox w, сторона квадрата c, угол наклона альфа. Тогда
jaDaY.png
Используем подстановку Веерштрасса
v5xXQ.png
Упростим уравнение
FVnwZ.png
Решим квадратное уравнение относительно tan(alpha/2) , коэффициенты 2GTL0.png
b8cLB.png
Для ненулевого наклона дискриминант положительный
6cSgf.png
Логика вроде правильная, вычисления тоже, а ответ неверный. Подскажите, пожалуйста, в чём я ошибся, и посоветуйте способ аккуратно определить наклон фактически квадрата вписанного в квадрат.
Вот пример на MATLABе
img = false(25,25);
img(5:16,5:16) = true;
rot_img = imrotate(img, 30, 'crop');
props = regionprops(bwlabel(rot_img),'BoundingBox');
bbox = cat(1,props.BoundingBox);
w = bbox(3);
h = 12;
a = -1*(1+w/h); b = 2; c = 1 - w/h;
D = b^2 - 4*a*c;
alpha = 2*atand((-b + sqrt(D))/(2*a));
%alpha = 25.5288


EDIT Спасибо за уточнения по тригонометрии, у меня с ней со школы сложные отношения.
Понял, что я некорректно задал вопрос, более точно он должен звучать так: как точно (+/- 0,5 градуса) определить наклон коротких линий (10-50 пикселей)? Положение линий не важно, только наклон.
Я поигрался с формулами из ответов, видно, что они дают одинаковый, но далёкий от желаемого ответ, при этом результат вычислений улучшается с ростом линейного размера объекта. Значит, упираемся в растеризацию, и надо искать относительно "лёгкий" в плане скорости алгоритм с субпиксельным разрешением. Пока я нашёл только поиск линий через преобразование Радона:
p = bwperim(rot_img);
theta=0:0.1:179.9;
[R,xp] = radon(p,theta); %Преобразование Радона
a=imregionalmax(R,true(3,3)); %Локальные двумерные максимумы преобразования Радона
[r,c]=find(a); idx=sub2ind(size(a),r,c); maxvals=R(idx);
[val,midx]=sort(maxvals,'descend');
mean(rem(theta(c(midx(1:4))),90)) %Выбираем 4 самых больших локальных максимума
%29.85

EDIT2 образец картинки после бинаризации После сканирования нужно выровнять картинку. Нужна большая точность и скорость, а качество сканирование может быть любым, включая очень низкое.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 2
@U235U235
w/c=sin(a)+cos(a)
(w/c)^2=1+sin(2a)
sin(2a)=(w/c)^2-1
a=0.5*arcsin((w/c)^2-1)
Ответ написан
hint000
@hint000
у админа три руки
Зачем так сложно?! Есть готовая формула.
здесь формула (24)
или здесь она же под номером 9
w/c = sin(alpha)+cos(alpha) = sqrt(2)*sin(alpha+Pi/4)

P.S.
Используем подстановку Веерштрасса
Принято его фамилию писать так: Вейерштрасс.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы