Как рассчитать количество «зеленых пятен» на изображении? - PullRequest
1 голос
/ 17 ноября 2010

Привет, у меня есть куча изображений.Давайте предположим, что все они одного размера.Изображения имеют черный фон и некоторые квази круглые зеленые пятна, которые представляют флуоресценцию.Я должен рассчитать количество (в процентах) флуоресценции каждого изображения.Т.е. область зеленых пятен.

Есть идеи, как это сделать, например на Java?

Ответы [ 4 ]

5 голосов
/ 01 декабря 2010

Это стандартная проблема в обработке изображений, которая называется сегментация изображения . Вы сможете найти огромное количество информации об этом.

В частности, это распространенная проблема при обработке микроскопических изображений, чем вы и занимаетесь. Я думаю, что могут быть постоянные операции, чтобы сделать это в ImageJ ; в противном случае это будет довольно простой макрос в ImageJ, и, поскольку ImageJ находится в Java, вы можете написать код Java, используя библиотеки ImageJ, если хотите.

Я бы предложил подход, в котором вы:

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

Вместо того, чтобы делать шаг К-средних, вы можете просто выбрать порог из гистограммы (скажем, найдите долину между двумя вершинами) и сегментировать ее. Или используйте некоторую адаптивную сегментацию (скажем, сравнивая пиксели с медианой в их окрестностях), но это потребует некоторой настройки.

0 голосов
/ 17 ноября 2010

Вы можете, например, использовать imagemagik , см. http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=16177

0 голосов
/ 01 декабря 2010

Несколько мыслей:

  • Вы можете выполнить обнаружение края и затем выполнить грубое преобразование круга .Это должно хорошо работать, если вы уже знаете радиус кругов.
  • При сравнении цветов вы можете использовать цветовое пространство, которое лучше подходит для нечеткого сравнения.Например, цветовое пространство HSV
  • Поскольку ваш фон черный, вероятно, проще всего рассчитать яркость и применить пороговое значение.Затем подсчитайте количество пикселей выше порогового значения.
  • При публикации сообщения о проблеме со зрением всегда полезно просмотреть материал ввода.
0 голосов
/ 17 ноября 2010

Сейчас у меня нет времени вдаваться в подробности, но я могу обрисовать для вас процесс:

Прокручивать изображения

  1. Загрузить каждое изображение в BufferedImage(http://download.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html)
  2. Переберите каждый пиксель (x, y) и получите цвет для этого пикселя (int getRGB (int x, int y)) *
  3. Сравните этот цвет с эталонным цветом (например, 0x7FFF00для зеленого цвета) или определите диапазон принятых цветов.
  4. Если он совпадает, увеличьте счетчик
  5. После запуска цикла сравните счетчик с общим количеством пикселей и получите, и вы получитеваш процент

(Примечание: это, вероятно, очень наивный способ сделать это, и возможна масса оптимизаций, но это должно быть начало)

...