Кондрашова Виктория. Технология STL. Маркировка компонентов бинарного изображения. Вариант 29.#655
Open
neishis wants to merge 4 commits intolearning-process:masterfrom
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Описание
Задача: Маркировка компонентов бинарного изображения.
Вариант: 29
Технология: STL
Описание:
Реализован параллельный алгоритм маркировки связных компонент на бинарном изображении с использованием
std::thread. Изображение представлено как одномерный массивuint8_t, где 0 — объект (чёрный пиксель), 1 — фон. Используется 4-связность (соседи по горизонтали и вертикали).Алгоритм:
Изображение разбивается на равномерные горизонтальные полосы в зависимости от количества доступных аппаратных потоков. Через
std::vector<std::thread>параллельно запускаются рабочие потоки, каждый из которых независимо сканирует свою полосу и производит разметку локально-уникальными метками. Дождавшись завершения потоков, выполняется последовательное объединение меток с помощью алгоритма Union-Find. Сначала объединяются метки по горизонтали, затем анализируются границы между полосами, которые обрабатывали разные потоки. На финальном этапе происходит перенумерация меток (чтобы они шли непрерывно: 1, 2, 3 и т.д.).Сложность:
Параллельный этап (сканирование по полосам): O(W·H / P) — каждый поток обрабатывает свою независимую полосу
Последовательные этапы:
Union-Find объединение: O(W·H·α(W·H))
Перенумерация меток: O(W·H)
Входные данные:
ImageData: бинарное изображение (векторuint8_t), ширина и высотаВыходные данные:
Result: количество компонент (count) и 2D-матрица меток (labels)Тестирование (обновлено для 100% покрытия):
u_shapeи матрица 5x5complex).Чек-лист
<фамилия>_<первая_буква_имени>_<короткое_название_задачи>clang-formatлокально в моем форке (нет ошибок форматирования)clang-tidyлокально в моем форке (нет предупреждений/ошибок)nesterov_a_vector_sum), а не вmaster