Я не думаю, что мой будет полным ответом, но я предложу то, что я знаю, и, так как это отредактированный сообществом сайт, я надеюсь, что кто-то скоро даст бесплатный ответ :)
Адаптивные методы определения порога - это те, которые не используют один и тот же порог по всему изображению .
Но для некоторых более простых применений иногда достаточно просто выбрать порог с помощью метода, более умного, чем самый простой итерационный метод . Метод Оцу является популярным методом определения пороговых значений, который предполагает, что изображение содержит два класса пикселей - передний план и фон , и имеет бимодальную гистограмму . Затем он пытается минимизировать их совокупный спред (внутриклассовая дисперсия).
Простейшими алгоритмами, которые можно считать по-настоящему адаптивными методами определения порогов, будут те, которые разбивают изображение на сетку ячеек, а затем применяют простой метод определения порогов (например, итеративный метод Оцу) к каждой ячейке, рассматривая его как отдельное изображение (и предполагая, что бимодальная гистограмма). Если субизображение не может быть правильно пороговым, можно использовать порог от одной из соседних ячеек.
Альтернативный подход к нахождению локального порога заключается в статистическом исследовании значений интенсивности локальной окрестности каждого пикселя . Порог отличается для каждого пикселя и рассчитывается исходя из его локальной окрестности (возможны медиана, среднее и другие варианты). Существует реализация такого рода методы , включенных в библиотеке OpenCV в cv::adaptiveThresholding
функции.
Я нашел другой подобный метод, названный Bradley Local Thresholding . Он также проверяет окрестность каждого пикселя, устанавливая яркость на черный, если яркость пикселей на t процентов ниже средней яркости окружающих пикселей. Соответствующий документ можно найти здесь .
В этом ответе о стековом потоке упоминается локальный (адаптивный) метод определения порогов, называемый Niblack, но я раньше о нем не слышал.
Наконец, есть метод, который я использовал в одном из моих предыдущих небольших проектов, он называется Thresholding изображения с помощью Variational Minimax Optimization . Это итерационный метод, основанный на оптимизации энергетической функции, которая представляет собой нелинейную комбинацию двух компонентов. Один из компонентов направлен на вычисление порогового значения, основанного на положении наиболее сильных изменений интенсивности изображения. Другой компонент направлен на сглаживание порога на (объектных) границах. Он хорошо зарекомендовал себя на изображениях аналоговых инструментов (различное затенение и отражение от стекла / пластика), но требовал тщательного выбора количества итераций.
Позднее редактирование : вдохновлено комментарием к этому ответу . Есть еще один способ работы с неравномерным освещением. Я напишу здесь о ярких объектах на темном фоне, но те же рассуждения могут быть применены, если ситуация обратная. Порог - преобразование белого цилиндра изображения с постоянным порогом вместо исходного изображения . Белый цилиндр изображения - это не что иное, как разница между изображением и его открытием . В качестве дальнейшего объяснения позвольте мне предложить цитату из П. Сойля: Анализ морфологического изображения :fγ(f)
Открытие исходного изображения с большим квадратом SE удаляет все соответствующие структуры изображения, но сохраняет функцию освещения. Белый цилиндр исходного изображения или вычитание функции освещения из исходного изображения выводит изображение с однородным освещением.