Обнаружить довольно яркие пятна на изображении
У меня есть немного шумное изображение, где фон не является однородным. Изображение содержит более выпуклые пятна, и мне нужно их обнаружить. Вот ссылка на пример изображения:
Я знаю, что существует много алгоритмов обнаружения кругов, но разница между средой и объектом слишком мала. Есть ли у вас какие-либо предложения, как разделить более яркое место? Или есть идея увеличить разницу в интенсивности?
Обновить:
среда OpenCV - это C++. Я попробовал адаптивный порог со многими параметрами. Вот результат:
Это неплохо, но на изображении много других черных пятен. И иногда области пятен около того же самого объекта, таким образом я не могу различить позже.
2 ответа
Как правило, метод заключается в размытии изображения, так что мелкие детали становятся неактуальными и сохраняются только крупномасштабные различия в освещенности фона. Затем вы вычитаете размытое изображение из оригинала, чтобы убрать неравномерное освещение, оставляя видимыми только локализованные элементы.
Мой предпочтительный инструмент - ImageMagick, но принцип тот же в OpenCV. Здесь я клонирую ваше исходное изображение, размываю его на 8 пикселей, а затем вычитаю размытое изображение из оригинала:
convert http://s8.postimg.org/to03oxzyd/example_image.png \( +clone -blur 0x8 \) -compose difference -composite -auto-level out.jpg
И здесь я размываю более 32 пикселей и вычитаю размытое изображение из оригинала:
convert http://s8.postimg.org/to03oxzyd/example_image.png \( +clone -blur 0x32 \) -compose difference -composite -auto-level out32.jpg
Чтобы увеличить контраст изображения, вы можете взглянуть на метод выравнивания гистограммы.
На основе гистограммы изображения оно будет перераспределять значения интенсивности пикселей изображения таким образом, чтобы области с низкой контрастностью могли получить более высокую контрастность. Тогда операции с порогом интенсивности, выполняемые с вашим изображением, могут дать лучшие результаты. Для справки взгляните на: http://en.wikipedia.org/wiki/Histogram_equalization
Существует также реализация этой операции в OpenCV:
void equalizeHist(InputArray src, OutputArray dst)