|
|
||||||||||||||||||||||||||||||||
Вход |
Раздел "Обработка сигналов и изображений\Image Processing Toolbox"
И.М.Журавель "Краткий курс теории обработки изображений" В оглавление \ К следующему разделу \ К предыдущему разделу Измерение углов пересечения Часто в машинном зрении применяются автоматические измерения различных геометрических параметров с применением технологии захвата и обработки изображений. Измерение угла и определение точки пересечения двух элементов некоторой конструкции выполняется с использованием функции bwtraceboundary, которая реализует также автоматическое отслеживание границ. Содержание
Шаг 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: Подгонка линий границ. 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'); |
Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2002 г.)
|
||
На первую страницу \ Сотрудничество \ MathWorks \ SoftLine \ Exponenta.ru \ Exponenta Pro | ||
E-mail: | ||
Информация на сайте была обновлена 11.05.2004 |
Copyright 2001-2004 SoftLine Co Наши баннеры |