У меня есть следующий вопрос. Я хочу сделать региональное segmenation, как показано в учебнике по сегментации изображений http://scikit-image.org/docs/dev/user_guide/tutorial_segmentation.html. Учебник очень ясен. Но часть, в которой они использовали экстремальные части гистограммы серых значений, кажется мне непонятной. Они используют значения 30 и 150 следующей гистограммы без объяснения того, как их получить:
Теперь мой вопрос: как получить эти внешние экстремумы?
Хотя ваш образ 2D, ваша гистограмма значений серого только 1D. Поиск пиков или максимумов в основном сводится к поиску точек с более высоким значением, чем все их соседние точки.
Однако, поскольку ваша кривая гистограммы не является гладкой, обратите внимание, что если вы сделаете наивный поиск, вы найдете множество и множество локальных пиков из-за крошечных колебаний.
Вы хотите найти максимумы, используя "более грубую" версию вашей кривой. Вы можете получить это, сначала сглаживая его. Это выполняется с помощью свертки с фильтром нижних частот, что аналогично выполнению локального взвешенного усреднения значений в определенном окне.
scipy.signal.find_peaks_cwt автоматически сгладит массив и вернет вам пики. Все, что вам нужно сделать, это указать ожидаемую ширину пиков, которые вы хотите найти.
Это даст вам показатели вершин. Если вы хотите "внешние", просто возьмите первый и последний. Затем используйте эти индексы для поиска соответствующих гистограмм (оттенки серого).
Обратите внимание, однако, что для сегментации в регионе в целом соответствующие пики могут быть не всегда внешними! Это произошло в случае с изображением определенных монет, но вам, вероятно, придется немного поэкспериментировать в зависимости от изображения. Это более вероятно, когда есть высокая контрастность между фоном и передним планом (и они оба грубо однородны). В учебнике, о котором вы говорили, мне кажется, что пики были фактически выбраны (человеческим) контролем гистограммы.