exponenta event banner

reducepoly

Уменьшение плотности точек в окупаемости инвестиций с помощью алгоритма Рамера-Дугласа-Пекера

Описание

пример

P_reduced = reducepoly(P) уменьшает плотность точек в массиве P. reducepoly функция использует алгоритм упрощения линий Рамера-Дугласа-Пьюкера, удаляя точки вдоль прямых и оставляя только точки (точки, где линия изогнута).

P_reduced = reducepoly(P,tolerance) уменьшает плотность точек в массиве P, где tolerance указывает, насколько точка может отклоняться от прямой линии.

Примеры

свернуть все

Чтение изображения в рабочую область.

I = imread('coins.png');
imshow(I)

Figure contains an axes. The axes contains an object of type image.

Преобразование изображения из оттенков серого в двоичное.

bw = imbinarize(I);

Получите границы всех монет в двоичном изображении.

[B,L] = bwboundaries(bw,'noholes');

Выберите границу первой обнаруженной монеты.

coinNumber = 1;
boundary = B{coinNumber};

Постройте график границы первой обнаруженной монеты над исходным изображением.

hold on
visboundaries({boundary})
xlim([min(boundary(:,2))-10 max(boundary(:,2))+10])
ylim([min(boundary(:,1))-10 max(boundary(:,1))+10])
hold off

Figure contains an axes. The axes contains 3 objects of type line, image.

Использовать reducepoly для уменьшения количества точек, определяющих границу монеты. Возврат меньшего числа точек путем увеличения допуска от значения по умолчанию 0.001.

tolerance = 0.02;
p_reduced = reducepoly(boundary,tolerance);

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

line(p_reduced(:,2),p_reduced(:,1), ...
       'color','b','linestyle','-','linewidth',1.5,...
       'marker','o','markersize',5);
title('Original Polygon (Red) and Reduced Polygon (Blue)');

Figure contains an axes. The axes with title Original Polygon (Red) and Reduced Polygon (Blue) contains 4 objects of type line, image.

Входные аргументы

свернуть все

Уменьшаемые точки, указанные как n-на-2 числовая матрица формы [x1 y1; ...; xn yn]. Каждая строка в массиве определяет вершину в форме окупаемости инвестиций, например полилинию, многоугольник или произвольный отрезок.

Например, можно нарисовать ROI от имени пользователя, используя drawfreehand функция. Затем получите вершины окупаемости инвестиций из Position свойство объекта ROI freehand.

roi = drawfreehand;
P = roi.Position;

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Чувствительность алгоритма уменьшения, заданного как числовой скаляр в диапазоне [0, 1]. Увеличение допуска увеличивает количество удаленных точек. Значение допуска, равное 0 имеет минимальное снижение баллов. Значение допуска, равное 1 приводит к максимальному уменьшению точек, оставляя только конечные точки линии.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Выходные аргументы

свернуть все

Уменьшенный набор данных, возвращаемый в виде цифровой матрицы m-на-2. Количество уменьшенных точек обычно меньше, чем количество исходных точек в P.

Типы данных: double

Алгоритмы

Алгоритм упрощения линии Рамера-Дугласа-Пекера рекурсивно подразделяет форму, ищущую замену серии точек прямой линией. Алгоритм проверяет, что ни одна точка на участке не отклоняется от прямой более чем на величину, заданную tolerance.

Представлен в R2019b