segmentGroundSMRF

Сегмент земли из данных лидара с помощью алгоритма SMRF

Описание

пример

groundPtsIdx = segmentGroundSMRF(ptCloud) сегментирует входное облако точек, ptCloud и возвращает логическую матрицу или вектор groundPtsIdx. Функция устанавливает индексы наземной точки равными true и true для нетронутых точек.

groundPtsIdx = segmentGroundSMRF(ptCloud,gridResolution) дополнительно задает размерность элемента сетки.

[groundPtsIdx,nonGroundPtCloud,groundPtCloud] = segmentGroundSMRF(___) дополнительно возвращает точки заземления и точки без заземления как индивидуальные pointCloud объекты. Используйте этот синтаксис с любыми комбинациями входных аргументов в предыдущих синтаксисах.

пример

[___] = segmentGroundSMRF(___,Name,Value) задает опции, используя один или несколько аргументов имя-значение. Для примера, 'ElevationThreshold',0.4 устанавливает порог повышения для идентификации нетронутых точек равным 0,4.

Примеры

свернуть все

Сегментировать землю в неорганизованном воздушном облаке точек.

Создайте lasFileReader объект для доступа к данным файлам LAS.

fileName = fullfile(toolboxdir('lidar'), 'lidardata', 'las', ...
    'aerialLidarData2.las');
lasReader = lasFileReader(fileName);

Считывайте данные облака точек из файла LAS с помощью readPointCloud функция.

ptCloud = readPointCloud(lasReader);

Сегментируйте данные земли из облака точек.

[groundPtsIdx,nonGroundPtCloud,groundPtCloud] = segmentGroundSMRF(ptCloud);

Визуализация наземных и негемальных точек.

figure
pcshowpair(groundPtCloud, nonGroundPtCloud)

Figure contains an axes. The axes contains 2 objects of type scatter.

Сегментируйте землю в организованном облаке точек. Облако точек было захвачено в сценарии шоссе.

Загрузите данные облака точек в рабочую область.

ld = load('drivingLidarPoints.mat');

Сегментируйте данные земли из облака точек.

[~,nonGroundPtCloud,groundPtCloud] = segmentGroundSMRF(...,
  ld.ptCloud,'ElevationThreshold',0.1,'ElevationScale',0.25);

Визуализация наземных и неземных точек.

figure
pcshowpair(groundPtCloud,nonGroundPtCloud)
xlim([-60 60])
ylim([-50 50])

Figure contains an axes. The axes contains 2 objects of type scatter.

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

свернуть все

Данные облака точек, заданные как pointCloud объект.

Размер каждого элемента сетки, заданный как положительная скалярная величина.

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

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'ElevationThreshold',0.4 устанавливает порог повышения, чтобы идентифицировать неземные точки равным 0,4.

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

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

Порог уклона для идентификации нетронутых элементов сетки на карте минимальной поверхности повышения, заданной в виде неотрицательного скаляра. Функция классифицирует элемент сетки как нетронутый, если его уклон больше SlopeThreshold. Увеличьте это значение, чтобы классифицировать крутые склоны как землю.

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

Порог повышения для идентификации нетронутых точек, заданный как неотрицательный скаляр. Функция классифицирует точку как неземную, если различие повышений между точкой и предполагаемой поверхностью земли больше ElevationThreshold. Увеличьте это значение, чтобы охватить больше точек от ухабистого грунта.

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

Повышение коэффициент масштабирования порога относительно наклона расчетной поверхности земли, заданный как неотрицательный скаляр. Увеличьте это значение, чтобы идентифицировать наземные точки на крутых склонах.

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

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

свернуть все

Двоичная карта сегментированного облака точек, возвращенная как логическая матрица для организованных облаков точек и как логический вектор для неорганизованных облаков точек. Функция устанавливает местоположения наземных точек в матрице равными true и нетронутые точки, чтобы false.

Облако точек нетронутых точек, возвращаемое как pointCloud объект.

Облако точек земли, возвращаемое как pointCloud объект.

Алгоритмы

Алгоритм [1] простого морфологического фильтра (SMRF) сегментирует данные облака точек в наземные и неземные точки. Алгоритм разделен на три этапа:

  1. Создайте минимальную поверхность повышения из данных облака точек.

  2. Сегментируйте поверхность в заземленные и неземные элементы сетки.

  3. Сегментируйте исходные данные облака точек.

Минимальное создание поверхности

  1. Разделите данные облака точек на сетку по размеру xy- (вид птичьего глаза). Задайте размерность элемента сетки используя gridResolution.

  2. Найдите самое низкое значение повышения (Zmin) для каждого элемента сетки (пикселя).

  3. Объедините все значения Zmin в матрицу 2-D (растровое изображение), чтобы создать минимальную карту поверхности повышения.

Сегментация карты поверхности

  1. Применить морфологическую операцию открытия на карте минимальной поверхности. Для получения дополнительной информации о морфологическом открытии см. «Типы морфологических операций».

  2. Используйте дискообразный элемент структурирования с радиусом 1 пиксель. Для получения дополнительной информации см. раздел «Структурирование элементов».

  3. Вычислите уклон между минимальной поверхностью и открытыми картами поверхностей для каждого элемента сетки. Если различие больше, чем порог повышения, классифицируйте пиксель как не-заземленный.

  4. Выполните шаги с 1 по 3 итерационно. Увеличьте радиус элемента структурирования на 1 пиксель в каждой итерации, пока он не достигнет максимального радиуса, заданного MaxWindowRadius.

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

Сегментация облака точек

  1. Примените двоичную маску на исходной карте минимальной поверхности, чтобы исключить сетки без заземления.

  2. Заполните незаполненные сетки с помощью методов интерполяции изображений, чтобы создать предполагаемую модель повышения.

  3. Вычислите различие повышений между каждой точкой в исходном облаке точек и предполагаемой моделью повышения. Если различие больше ElevationThreshold, классифицируйте пиксель как не-заземленный.

Ссылки

[1] Pingel, Thomas J., Keith C. Clarke, and William A. McBride. «Улучшенный простой морфологический фильтр для классификации наземных данных о ЛИДАРЕ в воздухе». ISPRS Journal of Photogrammetry and Remote Sensing 77 (March 2013): 21-30. https://www.sciencedirect.com/science/article/abs/pii/S0924271613000026? via%3Dihub.

См. также

Функции

Объекты

Введенный в R2021a