Обнаружение объектов на белом фоне в Python
Я пытаюсь использовать Python для определения количества объектов на белой поверхности. Пример изображения находится в конце этого поста.
Мне интересно, как мне это сделать, в основном потому, что фон белый, и большую часть времени он обнаруживается как передний план.
То, что я сейчас имею в Python на основе этого урока ( http://pythonvision.org/basic-tutorial), использует несколько библиотек и определяет белый цвет как объект, поэтому количество равно 1, инструменты обнаруживаются в качестве фона и, таким образом, игнорируются:
dna = mahotas.imread('dna.jpeg')
dna = dna.squeeze()
dna = pymorph.to_gray(dna)
print dna.shape
print dna.dtype
print dna.max()
print dna.min()
dnaf = ndimage.gaussian_filter(dna, 8)
T = mahotas.thresholding.otsu(dnaf)
labeled, nr_objects = ndimage.label(dnaf > T)
print nr_objects
pylab.imshow(labeled)
pylab.jet()
pylab.show()
Есть ли варианты получить белую часть в качестве фона и инструменты в качестве переднего плана?
Заранее спасибо!
Пример изображения:
Сегментированное изображение, где красный цвет является передним планом, а синий - фоном (объединение нескольких инструментов не является проблемой):
1 ответ
Если тень не проблема
Вы можете пометить изображения в mahotas ( http://mahotas.readthedocs.org/en/latest/labeled.html), используя это двоичное изображение. Вы также можете использовать skimage.morphology (который использует ndlabel, как уже упоминалось в комментариях). http://scikit-image.org/docs/dev/auto_examples/plot_label.html
Это примеры алгоритмов соединения компонентов и являются стандартными в любом общем пакете обработки изображений. ImageJ также делает это довольно просто.
Если тень это проблема
Отрезное пороговое значение Otsu возвращает одно значение: яркость пикселя, и все, что вы делаете, - это сохраняете все пиксели, которые тусклее, чем этот порог. Этот метод запутывается вашими тенями, поэтому вам нужно попробовать другой алгоритм сегментации, предпочтительно тот, который выполняет локальную сегментацию (т. Е. Он сегментирует небольшие области изображения по отдельности.)
Адаптивные или локальные методы не имеют этой проблемы и будут очень хорошо подходить для теней вашего изображения:
http://scikit-image.org/docs/dev/auto_examples/plot_threshold_adaptive.html
В махотах должны быть другие методы сегментации, но я знаю только о scikit-изображении. Если вам нужен серьезный обзор по сегментации, ознакомьтесь с этой статьей: https://peerj.com/preprints/671/
Полное раскрытие, это моя статья.