Батьков Филипп. Технология STL. Повышение контраста полутонового изображения посредством линейной растяжки гистограммы. Вариант 28#688
Open
weyland0 wants to merge 3 commits intolearning-process:masterfrom
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.
Описание
Решение находится в файле
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 пикселей.Чек-лист
batkov_f_contrast_enh_lin_hist_stretchclang-formatлокально в моем форке (нет ошибок форматирования)clang-tidyлокально в моем форке (нет предупреждений/ошибок)(например,
nesterov_a_vector_sum), а не вmasterдостоверными