Найти устьица в изображении микроскопии растений

26

Вот вопрос к специалистам по обработке изображений.

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

Я использую OpenCV. Мой план состоит в том, чтобы рассмотреть потенциально полезные функции для дискриминации устьиц.

  • Классификаторы текстуры
    • DCT (дискретное косинусное преобразование / анализ в частотной области)
    • LBP (локальные двоичные шаблоны)
  • HOG (гистограмма ориентированных градиентов)
  • Надежные детекторы функций (я скептически отношусь)
    • Харрис углы
    • SIFT, SURF, STAR и т. Д.
  • Каскадный классификатор Хаара / Особенности альта-Джонса

И, возможно, разработать новый дескриптор функции. Я оставляю выбор классификатора на данный момент.

Что я пропустил? Как бы вы решили это? Решения для подобных проблем обнаружения объекта были бы очень полезны.

Образцы изображений здесь .

устьица

После полосового фильтра: полосовой фильтр

Обнаружение ловких краев не обещает. Некоторые области изображения не в фокусе: обнаружение острых краев

Мэтт М.
источник
1
Может быть, вместо того, чтобы пытаться найти устьица, вы можете попытаться удалить лабиринты?
эндолит
1
Сколько изображений вы должны обработать? Как быстро это должно быть? Насколько это должно быть автоматизировано?
эндолит
1
Это не должно быть очень быстро. Мы обрабатываем порядка 1000 изображений. Это должно быть автоматически - выгрузить изображения в каталог и перейти.
Мэтт М.

Ответы:

15

Извините, я не знаю OpenCV, и это скорее этап предварительной обработки, чем полный ответ:

Во-первых, вам не нужен детектор краев. Детектор кромки преобразует переходы (например, из темного в светлое):

    _____ / ~~~~~

в гребни (яркие линии на темном), как это:

    ____ / _____

Другими словами, он выполняет дифференциацию.

Но на ваших изображениях есть свет, сияющий вниз в одном направлении, который показывает нам рельеф трехмерной поверхности. Мы воспринимаем это как линии и края, потому что мы привыкли видеть вещи в 3D, но на самом деле это не так, поэтому детекторы краев не работают, а сопоставление с шаблоном не будет легко работать с повернутыми изображениями (идеальный вариант). совпадение при повороте на 0 градусов фактически полностью отменило бы на 180 градусов, потому что свет и темнота совпали бы друг с другом).

Если высота одной из этих лабиринтных линий выглядит так со стороны:

    ____ / _____

тогда функция яркости при освещении с одной стороны будет выглядеть так:

    ____ ____ ∧v

Это то, что вы видите на своих изображениях. Облицовочная поверхность становится ярче, а задняя поверхность становится темнее. Таким образом, вы не хотите дифференцироваться. Вам необходимо интегрировать изображение по направлению освещения, и оно даст вам исходную карту высот поверхности (приблизительно). Тогда будет проще сопоставлять вещи, будь то через преобразование Хафа, сопоставление с шаблоном или что-то еще.

Я не уверен, как автоматизировать поиск направления освещения. Если это одинаково для всех ваших изображений, отлично. В противном случае вам придется найти самую большую контрастную линию и предположить, что свет перпендикулярен ей или чему-то еще. Для моего примера я повернул изображение вручную в правильном направлении со светом слева:

оригинал, повернутый

Вам также необходимо удалить все низкочастотные изменения в изображении, чтобы выделить только быстро меняющиеся линейные элементы. Чтобы избежать звона артефактов, я использовал 2D Gaussian Blur, а затем вычел это из оригинала:

фильтр верхних частот

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

выход

Теперь устьицы - это белые эллипсы, а не белые в некоторых местах и ​​черные в других.

Оригинал:

введите описание изображения здесь

Интегрированное:

введите описание изображения здесь

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

Преобразование Хафа может быть использовано для обнаружения таких ребристых эллипсов, сделанных из «краевых пикселей», хотя это действительно дорого для вычислений и памяти, и они не являются идеальными эллипсами, так что это должен быть немного «неаккуратный» детектор. Я никогда не делал этого, но есть много результатов Google для " обнаружения крутого эллипса ". Я бы сказал, что если вы обнаружите один эллипс внутри другого, в пределах пространства поиска определенного размера, его следует считать стомой.

Также см:

эндолиты
источник
PS У того, что я здесь сделал, есть имя? Это общий тип фильтра?
эндолит
1
+1 - Отличный ответ! Об автоматизации угла источника света - вы можете использовать детектор контуров, который вычисляет как величину, так и градиент, а затем вычисляет взвешенное (по маг.) Среднее значение градиента. Самые сильные ответы должны быть в направлении освещения.
Андрей Рубштейн
11

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

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

Далее - HOG выглядит многообещающе здесь. Другим решением может быть использование сильного детектора углов, такого как Moravec или Shi-Tomasi (с не максимальным подавлением) и поиск групп из 2 углов или 3-4 углов на одной линии в качестве кандидатов. После нахождения кандидатов вы можете применить активный контур для проверки (не уверен, что это действительно поможет, но это возможно)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

Еще одна возможность - использовать преобразование Хафа для эллипсов, возможно, с не 2, а 3-4 свободными параметрами.

mirror2image
источник
7

Частичный ответ. Поиск кандидатов с Mathematica:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

введите описание изображения здесь

Доктор белисарий
источник
Интересный результат ... возможно, сочетается с какой-то другой схемой ...
Мэтт М.
@ MAtt Да, я думаю, что отброшено не менее 80% нецелевой поверхности. Немного расширив маску, вы должны искать эллипсы. Независимо от того, какой метод вы используете (я все еще думаю о том, что я мог бы сделать), теперь гораздо проще, если вы знаете, что звери окружены.
Доктор Велизарий
1

Я бы начал с использования чувствительного детектора краев (например, величины градиента с низким порогом), а затем использовал преобразование Хафа, чтобы попытаться найти эллипсы. Кэнни все еще может работать. Я уверен, что есть параметры, которые вы можете настроить, чтобы сделать его более чувствительным и подобрать размытые края.

Дима
источник