Знайдіть ущільнення на зображенні мікроскопії рослин


26

Ось питання до фахівців з обробки зображень.

Я працюю над складною проблемою комп’ютерного зору. Завдання - підрахувати ущільнення (позначені нижче) на мікроскопічних зображеннях ДВЗ. Ці зображення стійкі до більшості поверхневих методів обробки зображень, таких як морфологічні операції та виявлення ребер. Він також відрізняється від інших завдань підрахунку комірок.

Я використовую OpenCV. Мій план - переглянути потенційно корисні риси щодо дискримінації вуст.

  • Класифікатори текстури
    • DCT (Дискретний косинусний перетворення / аналіз частотної області)
    • LBP (Локальні двійкові шаблони)
  • HOG (гістограма орієнтованих градієнтів)
  • Міцні детектори функцій (я скептично)
    • Гарріс куточки
    • SIFT, SURF, STAR тощо.
  • Хакарський каскадний класифікатор / Віола-Джонс

І, можливо, спроектувати дескриптор функції роману. Я поки що покидаю вибір класифікатора.

Що я пропустив? Як би ви вирішили це? Рішення подібних проблем виявлення об'єктів були б дуже корисними.

Зразки зображень тут .

продихи

Після смугового фільтра: смуговий фільтр

Виявлення ребра Кенні не є перспективним. Деякі області зображень поза фокусом: виявлення реберного ребра


1
Може, замість того, щоб намагатися знайти продихи, ви могли б спробувати видалити запаморочливі лінії?
ендоліт

1
Скільки зображень потрібно обробити? Наскільки швидко це потрібно? Наскільки це має бути автоматизовано?
ендоліт

1
Це не повинно бути дуже швидким. Обробляємо на замовлення 1000 зображень. Це має бути автоматичним - скидайте зображення в каталог та йдіть.
Метт М.

Відповіді:


15

Вибачте, я не знаю OpenCV, і це скоріше крок попередньої обробки, ніж повна відповідь:

По-перше, ви не хочете детектор краю. Крайовий детектор перетворює переходи (як цей темний-світлий):

    _____ / ‾‾‾‾‾

у хребти (яскраві темні лінії):

    ____ / _____

Він виконує диференціацію, іншими словами.

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

Якщо висота однієї з цих затишних ліній виглядає так збоку:

    ____ / _____

тоді функція яскравості при освітленні з одного боку буде виглядати так:

    ____ ∧v ____

Це ви бачите на своїх зображеннях. Лицьова поверхня стає яскравішою, а поверхня стає темнішою. Тож ви не хочете розмежовуватись. Потрібно інтегрувати зображення вздовж напрямку освітлення, і воно дасть вам оригінальну карту висоти поверхні (приблизно). Тоді буде простіше зіставляти речі, будь то через трансформацію Хаффа чи відповідність шаблонів чи будь-що інше.

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

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

Також потрібно усунути всі низькочастотні зміни зображення, щоб виділити лише швидкозмінні функції, що швидко змінюються. Щоб уникнути дзвінка артефактів, я використав 2D гауссова розмиття, а потім відніс це з оригіналу:

фільтрується з високим проходом

Інтеграція (сукупна сума) може легко втекти, що створює горизонтальні смуги. Я видалив їх іншим Гауссовим високопрохідним, але цього разу лише в горизонтальному напрямку:

вихід

Тепер продихи - це білі еліпси навколо, замість білих в одних місцях і чорних в інших.

Оригінал:

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

Інтегрований:

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

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 виглядає тут багатообіцяюче. Іншим рішенням може бути використання потужних кутових детекторів, таких як Моравець або Ши-Томасі (з не максимальним придушенням), і пошук груп з 2 кутів або 3-4 кутів на тій же лінії, що і кандидати. Знайшовши кандидатів, ви можете застосувати активний контур для перевірки (не впевнений, чи справді це допоможе, але це можливість)

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

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

Ще одна можливість полягає у використанні перетворення Хаффа для еліпсів, можливо, з не 2, а 3-4 вільними параметрами.


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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.