|
|
|||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Вход | |||||||||||||||||||||||||||||||||
|
Раздел "Обработка сигналов и изображений\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 Наши баннеры |
|