MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Обработка сигналов и изображений\image Processing Toolbox

И.М.Журавель "Краткий курс теории обработки изображений"

В оглавление \ К следующему разделу \ К предыдущему разделу

Измерение углов пересечения

Часто в машинном зрении применяются автоматические измерения различных геометрических параметров с применением технологии захвата и обработки изображений. Измерение угла и определение точки пересечения двух элементов некоторой конструкции выполняется с использованием функции bwtraceboundary, которая реализует также автоматическое отслеживание границ.

Содержание
  • Шаг 1: Считывание изображения.
  • Шаг 2: Определение области интереса.
  • Шаг 3: Пороговая обработка изображения.
  • Шаг 4: Поиск начальных точек каждой границы.
  • Шаг 5: Отслеживание границ.
  • Шаг 6: Подгонка линий границ.
  • Шаг 7: Определение угла пересечения.
  • Шаг 8: Поиск точки пересечения.
  • Шаг 9: Отображение результатов.
Шаг 1: Считывание изображения. Считаем изображение из графического файла gantrycrane.jpg и определим область интереса при решении этой задачи. Это изображение портала подъемного крана. RGB=imread('gantrycrane.png'); imshow(RGB); text(size(RGB, 2), size(RGB, 1)+15, 'Image courtesy of Jeff Mather', ... 'FontSize', 7, 'HorizontalAlignment', 'right'); line([300 328], [85 103], 'color', [1 1 0]); line([268 255], [85 140], 'color', [1 1 0]); text(150, 72, 'Измерение углов', 'Color', 'y', ... 'FontWeight', 'bold');

Шаг 2: Определение области интереса. Вырежем изображение, содержащее только те элементы конструкции крана, угол между которыми мы хотим определить. Далее необходимо определить контур двух металлических конструкций.

% Координаты области интереса можно задать вручную,
% далее отображаем нужную область с помощью imview
start_row=34;
start_col=208;
cropRGB=RGB(start_row:163, start_col:400, :);
imshow(cropRGB)
offsetX=start_col-1;
offsetY=start_row-1;

Шаг 3: Пороговая обработка изображения. Преобразуем исследуемое изображение в бинарное. Далее эти бинарные данные будут использованы для получения координат границ с помощью функции bwtraceboundary.

I=rgb2gray(cropRGB);
threshold=graythresh(I);
BW=im2bw(I, threshold);
BW=~BW; % дополнение изображения (объект интереса должен быть белым)
imshow(BW)
Шаг 4: Поиск начальных точек каждой границы.

Функция bwtraceboundary требует описания определенных точек контура. 
Эти точки являются стартовыми при отслеживании границ объектов.

Функция bwtraceboundary также требует описание исследуемого изображения, 
представленное в специальной форме.

dim=size(BW);
% горизонтальное направление
col1=4;
row1=min(find(BW(:, col1)));
% угловое направление
row2=12;
col2=min(find(BW(row2, :)));

Шаг 5: Отслеживание границ.

Функция bwtraceboundary позволяет реализовать также процедуру определения координат граничных точек. Для увеличения достоверности вычисленных углов и точек при расчетах нужно использовать максимальное число исследуемых граничных точек. Это число определяется экспериментально. При проведении процедуры определения координат границ также необходимо указывать направление отслеживания.

boundary1=bwtraceboundary(BW, [row1, col1], 'N', 8, 70);
% установим направление отслеживания - против часовой стрелки, сверху вниз
boundary2=bwtraceboundary(BW, [row2, col2], 'E', 8, 90,'counter');
imshow(RGB); hold on;
% отображение результатов на исходном изображении
plot(offsetX+boundary1(:, 2), offsetY+boundary1(:, 1), 'g', 'LineWidth', 2);
plot(offsetX+boundary2(:, 2), offsetY+boundary2(:, 1), 'g', 'LineWidth', 2);

Шаг 6: Подгонка линий границ.

Из набора пар координат (X,Y), полученных на прежнем шаге, нужно отбросить заведомо ложные, которые не принадлежат искомой линии. Для проведения этой процедуры каждой точке контура необходимо на основании некоторого критерия присвоить соответствующий весовой коэффициент.

Уравнение линии y=[x 1]*[a; b]. Параметры 'a' и 'b' определяются на основании критерия минимальной квадратической ошибки с использованием функции polyfit.

ab1=polyfit(boundary1(:, 2), boundary1(:, 1), 1);
ab2=polyfit(boundary2(:, 2), boundary2(:, 1), 1);

Шаг 7: Определение угла пересечения.

Используем функцию dot для поиска угла.

vect1=[1 ab1(1)]; % создание вектора на основании линейных выражений
vect2=[1 ab2(1)];
dp=dot(vect1, vect2);
% вычисление длины вектора
length1=sqrt(sum(vect1.^2));
length2=sqrt(sum(vect2.^2));
% вычисление угла
angle=180-acos(dp/(length1*length2))*180/pi
angle=
  129.5860

Шаг 8: Поиск точки пересечения.

Решение системы двух выражений в порядке получения координат (X,Y) точек пересечения.

intersection=[1 ,-ab1(1); 1, -ab2(1)] \ [ab1(2); ab2(2)];
% получение результата на исходном, 
% т.е. не вырезанном изображении.
intersection=intersection+[offsetY; offsetX]
intersection=
  143.0453
  295.7910

Шаг 9: Отображение результатов.

inter_x=intersection(2);
inter_y=intersection(1);
% отображение точек пересечения
plot(inter_x, inter_y, 'yx', 'LineWidth', 2);
text(inter_x-60, inter_y-30, [sprintf('%1.3f', angle), '{\circ}'],...
     'Color', 'y', 'FontSize', 14, 'FontWeight', 'bold');
interString=sprintf('(%2.1f, %2.1f)', inter_x, inter_y);
text(inter_x-10, inter_y+20, interString,...
     'Color', 'y', 'FontSize', 14, 'FontWeight', 'bold');

В оглавление \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика