AFAIK OpenCV не имеет такой функциональности, но возможно реализовать что-то подобное себе.
Для сортировки гистограмм вы можете использовать sortIdx, но в результате вы получите список самых больших ящиков, который отличается от локальных максимумов (они должны быть «окружены» меньшими значениями).
Для получения локальных максимумов вы можете сравнить каждый бин со своими соседями (2 в 1D корпусе). Бункер должен быть больше соседей с некоторым запасом, чтобы считаться локальным максимумом.
В зависимости от размера корзины вы можете фильтровать гистограмму до этого шага (например, сверните ее с гауссовым ядром), так как в противном случае вы получили бы слишком много этих максимумов, особенно для небольших размеров бункера. Если вы использовали гауссовское ядро - это сигма будет относиться к размеру окрестности, в которой обнаруженные локальные максимумы являются «глобальными».
Как только вы обнаружите эти точки - вы можете выполнить немаксимальное подавление, чтобы заменить группы точек, которые находятся очень близко друг к другу вместе с одной точкой. Простой стратегией для этого было бы сортировать эти максимумы в соответствии с некоторыми критериями (например, разницу с соседями), затем взять один максимум и удалить все точки в его окрестности (его размер может быть связан с гауссовским сигмасом ядра), принять следующий оставшиеся максимумы и снова удаляйте точки в своей окрестности и так далее, пока не закончите очки или не опустите некоторые значащие значения разницы.
Наконец, вы можете отсортировать оставшиеся очки-кандидаты по их абсолютным значениям (получить «самые большие» локальные максимумы) или их разницу с соседями (получить «самые острые»).
Вы можете попробовать другой подход. Мы можем использовать определение локального максимума this для реализации более простого алгоритма: просто сдвиньте скользящее окно размера S вдоль гистограммы и выберите максимум в каждой позиции. Это будет иметь некоторые проблемы:
- в местах с видными максимумом несколько позиций окна будет создавать точки, которые соответствуют одному и тому же максимуму (может быть исправлено с не максимальным подавлением),
- в местах с отсутствием или малым изменением его по вернет полуслучайные максимумы (может быть установлен с пороговым значением по дисперсии в окне или разностью между максимумом и соседством),
- в регионах с монотонной гистограммой он вернет наибольшее значение (что не обязательно является максимальным).
После того, как вы выполнили всю обработку «особого случая», эти два подхода были бы очень похожими, я считаю.
Еще одна вещь, которая может быть реализована, может быть «многомасштабным» подходом, который можно рассматривать как расширение, если они 2. В основном это сводится к обнаружению локальных максимумов для разных размеров соседства, а затем их хранение вместе с соответствующим размером окрестности , что может быть полезно для некоторых целей.
Как вы можете видеть, это довольно неопределенное руководство, и есть причина для этого: тип и количество локальных максим, которые вы хотите получить, скорее всего, будут зависеть от проблемы, о которой вы имеете в виду. Нет простого и легкого правила, чтобы решить, следует ли считать этот пункт локальным максимумом, поэтому вам следует начать с простого подхода, а затем уточнить его для вашего конкретного случая.