reducepoly

Уменьшайте плотность точек в ROI

Описание

пример

P_reduced = reducepoly(P) уменьшает плотность точек в массиве P. Задайте P как n-by-2 массив формы [x1 y1; ...; xn yn], где каждая строка представляет точку. Например, P мог быть массив, возвращенный одной из функций создания ROI, таких как drawfreehand или drawpolygon. reducepoly возвращает P_reduced, n-by-2 массив точек, который обычно меньше тот P.

reducepoly использует алгоритм упрощения линии Дугласа-Пеукера, удаляя точки вдоль прямой линии и уезжая только knickpoints (точки, где линия изгибается).

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

Примеры

свернуть все

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

I = imread('coins.png');

Преобразуйте изображение от полутонового изображения до двухуровневого изображения. Функция для нахождения контуров требует двухуровневых изображений.

bw = imbinarize(I);

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

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

Постройте контур для одной из монет по оригинальному изображению.

imshow(I)
hold on;
k = 1;
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2)
hold off;

Используйте reducepoly уменьшать число точек, задающее контур монеты.

p = [boundary(:,2) boundary(:,1)];
tolerance = 0.02; % choose suitable tolerance
p_reduced = reducepoly(p,tolerance);

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

hf = figure;
ha = axes('parent',hf,'box','on','Ydir','reverse');
axis equal
% Original data.
line(p(:,1),p(:,2),'parent',ha,...
      'color',[1 0.5 0],'linestyle','-','linewidth',1.5,...
      'marker','o','markersize',4.5)
% Reduced data.
line(p_reduced(:,1),p_reduced(:,2),'parent',ha,...
       'color',[0 0 1],'linestyle','-','linewidth',2,...
       'marker','o','markersize',5);
legend('Original points','Reduced points');
title('Douglas-Peucker algorithm');

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

свернуть все

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

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

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

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

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

свернуть все

Уменьшаемый набор данных, возвращенный как n-by-2 числовой массив.

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

Алгоритмы

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

Введенный в R2019b