Skip to content

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

Open
vadimdorogin65-cmd wants to merge 4 commits intolearning-process:masterfrom
vadimdorogin65-cmd:dorogin_v_bin_img_conv_hull_OMP

Conversation

@vadimdorogin65-cmd
Copy link
Contributor

@vadimdorogin65-cmd vadimdorogin65-cmd commented Mar 16, 2026

Описание

  • Задача: Построение выпуклой оболочки для компонент бинарного изображения
  • Вариант: 30
  • Технология: OMP
  • Описание вашей реализации и отчёта.
    реализации.
    Реализация построения выпуклой оболочки для компонент бинарного изображения с использованием OpenMP

Основные детали решения
Входные данные — бинарное изображение (width, height, одномерный вектор std::uint8_t со значениями 0/1, хранящийся построчно).
Сначала выполняется проход по изображению и выделяются связные компоненты:
используется обход в глубину (DFS) со стеком и 8‑связностью (учитываются горизонтальные, вертикальные и диагональные соседи);
для каждого стартового пикселя со значением 1 собирается множество точек компоненты в виде пар целочисленных координат (x, y);
после этого для каждой компоненты строится выпуклая оболочка алгоритмом монотонной цепи:
точки сортируются по координате x, при равенстве — по y, дубликаты удаляются;
по отсортированному набору точек по очереди строятся нижняя и верхняя части оболочки, при этом из хвоста удаляются точки, которые не образуют выпуклый поворот (проверка знака векторного произведения для тройки точек);
нижняя и верхняя части объединяются, образуя упорядоченный список вершин выпуклой оболочки компоненты.
Результатом работы алгоритма является вектор оболочек: для каждой связной компоненты — её выпуклая оболочка в виде последовательности точек.

Применение технологии параллелизма
Выделение связных компонент выполняется последовательно (один проход по изображению и формирование списков точек для каждой компоненты).
После этого этапа каждая компонента обрабатывается независимо: построение выпуклой оболочки для разных компонент распараллеливается с помощью #pragma omp parallel for.
Итерации цикла по компонентам распределяются между потоками, каждый поток локально строит оболочку своей компоненты, не обращаясь к общим разделяемым структурам (кроме результирующего массива оболочек, в который записывается по предвыделенным индексам).
Поскольку компоненты не пересекаются и не зависят друг от друга, синхронизация сведена к минимуму, что позволяет эффективно использовать многоядерный процессор при большом количестве компонент на изображении.


Чек-лист

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

@codecov-commenter
Copy link

Codecov Report

❌ Patch coverage is 88.15789% with 9 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@8b0c3a5). Learn more about missing BASE report.

Files with missing lines Patch % Lines
...orogin_v_bin_img_conv_hull_OMP/omp/src/ops_omp.cpp 89.33% 0 Missing and 8 partials ⚠️
..._v_bin_img_conv_hull_OMP/common/include/common.hpp 0.00% 0 Missing and 1 partial ⚠️

❌ Your patch status has failed because the patch coverage (88.15%) is below the target coverage (95.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff            @@
##             master     #355   +/-   ##
=========================================
  Coverage          ?   79.24%           
=========================================
  Files             ?      269           
  Lines             ?     9401           
  Branches          ?     4002           
=========================================
  Hits              ?     7450           
  Misses            ?     1374           
  Partials          ?      577           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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