Skip to content

Перяшкин Василий. Технология OMP. Построение выпуклой оболочки для компонент бинарного изображения. Вариант 30.#258

Closed
Excited669 wants to merge 24 commits intolearning-process:masterfrom
Excited669:peryashkin_v_binary_component_contour_processing_omp
Closed

Conversation

@Excited669
Copy link
Contributor

@Excited669 Excited669 commented Mar 6, 2026

Описание
Задача: Обработка контуров компонент бинарного изображения (поиск компонент связности и построение выпуклой оболочки)
Вариант: 30
Технология: OMP

Описание:
Входные данные — бинарное изображение, заданное структурой BinaryImage: ширина width, высота height и вектор data
(значения пикселей 0/1). Требуется выделить все компоненты связности (4-соседство) и для каждой компоненты построить
контур в виде выпуклой оболочки по точкам компоненты.

  1. Валидация входа:
  • Проверяется, что width > 0 и height > 0
  • Проверяется, что размер data равен width * height
  1. Поиск компонент связности (SEQ-часть внутри задачи):
  • Проходим по всем пикселям изображения
  • При встрече непосещённого пикселя со значением 1 запускается BFS/очередь по 4-соседям (вверх/вниз/влево/вправо)
  • Все точки, принадлежащие найденной компоненте, собираются в массив Point{x, y}
  • Результат шага: список компонент comps, где каждая компонента — список точек
  1. Построение выпуклой оболочки для каждой компоненты (параллельно OMP):
  • Для каждой компоненты независимо строится выпуклая оболочка алгоритмом монотонной цепи (Andrew / monotonic chain):
    • Точки сортируются лексикографически (x, затем y)
    • Удаляются дубликаты
    • Строится нижняя и верхняя цепи с проверкой ориентации (векторное произведение)
    • Итоговая оболочка — объединение нижней и верхней цепей
  • Так как оболочка каждой компоненты не зависит от остальных, используется распараллеливание:
    • #pragma omp parallel for для распределения компонент между потоками
    • Каждый поток строит оболочку своей компоненты и записывает в заранее выделенный массив результатов по индексу
  1. Формирование результата:
  • Выходные данные — OutType: вектор оболочек, где каждая оболочка — список Point в порядке обхода

Асимптотика:

  • Поиск компонент связности: O(W*H)
  • Построение оболочки для компоненты из k точек: O(k log k) из-за сортировки
  • Итоговая сложность: O(WH + Σ k_i log k_i), память: O(WH) на visited и хранение точек

Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем <фамилия><первая_буква_имени><короткое_название_задачи>
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи, а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и достоверными

@Excited669
Copy link
Contributor Author

Excited669 commented Mar 7, 2026

Я правильно понимаю, что сначала нужно было дождаться, пока первая работа замержится в master, а потом уже от master создавать новую ветку для второй работы ? @allnes

@@ -0,0 +1,25 @@
// tasks/peryashkin_v_binary_component_contour_processing/seq/include/ops_seq.hpp
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

одна задача один ревест - почему у вас seq версия в omp

@Excited669 Excited669 closed this Mar 8, 2026
@Excited669 Excited669 deleted the peryashkin_v_binary_component_contour_processing_omp branch March 8, 2026 06:43
@github-actions github-actions bot removed the task:seq label Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants