reducepoly

Уменьшайте плотность точек в ROI с помощью Ramer–Douglas–Peucker алгоритм

Описание

пример

P_reduced = reducepoly(P) уменьшает плотность точек в массиве P. reducepoly функционируйте использует Ramer-Douglas-Peucker алгоритм упрощения линии, удаляя точки вдоль прямых линий и уезжая только knickpoints (точки, где линия изгибается).

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

Примеры

свернуть все

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object with title Original Polygon (Red) and Reduced Polygon (Blue) contains 4 objects of type line, image.

Входные параметры

свернуть все

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

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

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-by-2 числовая матрица. Количество уменьшаемых точек обычно меньше, чем количество исходных точек в P.

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

Алгоритмы

Ramer-Douglas-Peucker алгоритм упрощения линии рекурсивно подразделяет форму, смотрящую на замену запуск точек с прямой линией. Алгоритм проверяет, что никакой смысл в запуске не отклоняется от прямой линии больше, чем значение, заданное tolerance.

Введенный в R2019b