Это стандартная проблема в обработке изображений, которая называется сегментация изображения . Вы сможете найти огромное количество информации об этом.
В частности, это распространенная проблема при обработке микроскопических изображений, чем вы и занимаетесь. Я думаю, что могут быть постоянные операции, чтобы сделать это в ImageJ ; в противном случае это будет довольно простой макрос в ImageJ, и, поскольку ImageJ находится в Java, вы можете написать код Java, используя библиотеки ImageJ, если хотите.
Я бы предложил подход, в котором вы:
- Предварительная обработка изображения для его очистки - вычитание фона путем вычитания медианного фильтра или гауссовой свертки с окрестностью, большей, чем ваши ячейки, или алгоритм скользящего шара (посмотрите на это в источнике ImageJ) или что-то подобное, возможно с последующим небольшим размытием (скажем, медианным фильтром с соседством 3x3) для удаления спеклов.
- Рассчитать гистограмму изображения
- Поиск двух пиков в гистограмме, один соответствует черным пикселям, один - зеленому
- Используйте значения двух пиков, чтобы заполнить двухкластерную сегментацию K-средних (2-средних, я полагаю!)
Вместо того, чтобы делать шаг К-средних, вы можете просто выбрать порог из гистограммы (скажем, найдите долину между двумя вершинами) и сегментировать ее. Или используйте некоторую адаптивную сегментацию (скажем, сравнивая пиксели с медианой в их окрестностях), но это потребует некоторой настройки.