Здравствуйте,
на изображении есть квадраты с известной длиной стороны, мне нужно узнать наклон относительно оси Х. Функция MATLAB regionprops возвращает выровненные по осям Bounding Box. Как я рассуждал:
Пусть ширина boundingbox w, сторона квадрата c, угол наклона альфа. Тогда
Используем подстановку Веерштрасса
Упростим уравнение
Решим квадратное уравнение относительно tan(alpha/2) , коэффициенты
Для ненулевого наклона дискриминант положительный
Логика вроде правильная, вычисления тоже, а ответ неверный. Подскажите, пожалуйста, в чём я ошибся, и посоветуйте способ аккуратно определить наклон фактически квадрата вписанного в квадрат.
Вот пример на 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
образец картинки после бинаризации После сканирования нужно выровнять картинку. Нужна большая точность и скорость, а качество сканирование может быть любым, включая очень низкое.