Skip to content

Батьков Филипп. Технология STL. Повышение контраста полутонового изображения посредством линейной растяжки гистограммы. Вариант 28#688

Open
weyland0 wants to merge 3 commits intolearning-process:masterfrom
weyland0:batkov_f_contrast_enh_lin_hist_stretch_stl

Conversation

@weyland0
Copy link
Copy Markdown
Contributor

Описание

  • Задача: Повышение контраста полутонового изображения посредством линейной растяжки гистограммы
  • Вариант: 28
  • Технология: STL
  • Описание:

Решение находится в файле stl/src/ops_stl.cpp и содержит следующие основные функции:

  • ValidationImpl — проверка корректности входных данных.
  • PreProcessingImpl — подготовка выходного буфера.
  • RunImpl — алгоритм обхода изображения, применяющий к каждому пикселю формулы линейной растяжки гистограммы. Параллельный поиск min/max выполняется при размере изображения от 100 000 пикселей, применение формулы растяжки выполняется параллельно всегда. Распараллеливание реализовано через std::thread.
  • PostProcessingImpl — проверка пустоты выходного буфера.

Также были реализованы следующие вспомогательные функции:

  • FindMinMaxParallel — параллельный поиск минимума и максимума: входной массив делится на равные блоки по числу потоков, каждый поток обходит свой блок и сохраняет локальные min / max в отдельные элементы векторов mins и maxs (без разделяемого состояния и мьютексов), после чего главный поток редуцирует результаты через std::ranges::min_element / std::ranges::max_element.

  • FindMinMax — выбирает последовательный (std::ranges::minmax_element) или параллельный вариант поиска min/max в зависимости от размера входного массива и числа доступных потоков.

  • ApplyStretchParallel — параллельное применение формулы линейной растяжки: массив аналогично делится на блоки, каждый поток независимо обрабатывает свой диапазон пикселей. Распараллеливание операции std::ranges::copy (для однородного изображения) не реализовано, так как опытным путём выяснилось, что оно не приводит к достаточному повышению производительности.


Функциональные тесты определены в файле functional/main.cpp и выполняются для STL-версии алгоритма на нескольких низко контрастных изображениях разного размера (100×100, 500×500, 1000×1000, 2000×2000), которые генерируются случайным образом.


Тест производительности находится в файле performance/main.cpp и выполняется для всех версий алгоритма (SEQ, OMP, TBB и STL) на фиксированном изображении размером 5000×5000 пикселей.


Чек-лист

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

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.

1 participant