Обнаружить довольно яркие пятна на изображении

У меня есть немного шумное изображение, где фон не является однородным. Изображение содержит более выпуклые пятна, и мне нужно их обнаружить. Вот ссылка на пример изображения:

Я знаю, что существует много алгоритмов обнаружения кругов, но разница между средой и объектом слишком мала. Есть ли у вас какие-либо предложения, как разделить более яркое место? Или есть идея увеличить разницу в интенсивности?

Обновить:

среда 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)

И учебник: http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html

Другие вопросы по тегам