reducepoly

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

Описание

пример

P_reduced = reducepoly(P) уменьшает плотность точек в массиве P. The 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]. Каждая строка массива задает вершину в форме информация только для чтения, например полилинию, многоугольник или freehand.

Для примера можно нарисовать информацию только для чтения freehand при помощи drawfreehand функция. Затем получите вершины информация только для чтения из Position свойство объекта 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