Обнаружение Округлости Изображения (На Примере Микрофотографии)

Всем привет! По профессии (строго говоря, будущей профессии) я на самом деле химик.

Сравнительно недавно появились интересные работы и возникла необходимость много работать с цифровым микроскопом, делать большое количество фотографий и определенным образом их обрабатывать.

А именно: найти линейные размеры частиц (обычно круглой формы и первоначально на глаз) и скрупулезно записать их в лабораторный журнал.

Неудивительно, что после первой сотни изображений я начал усиленно задумываться о хоть какой-то автоматизации этого процесса, но был один подвох: я прекрасно знал, что «объектно-ориентированное программирование — это очень хорошо», но.

Но на тот момент я знал только школьный TurboPascal, университетский VB и кодирование на PHP в процедурном варианте.

Покопавшись по форумам, и приняв во внимание тот факт, что за день мне удается работать как минимум на двух операционных системах (Mac/Windows/Ubuntu существуют в эйфорическом симбиозе), я особо не раздумывал и решил писать на Java .

Опуская подробности примерно недели, в свободное время, забивая голову парадигмой объектно-ориентированного программирования и бессонными ночами с мыслями типа «как, черт возьми, это работает», я постараюсь как можно короче рассказать об этом простом и быстрый «алгоритм», родившийся у меня.

Сразу стоит сказать, что он подходит только для достаточно четких изображений.

А вот, кстати, типичный представитель (вернее, примерно его десятая часть), которого нужно обработать:

Обнаружение округлости изображения (на примере микрофотографии)

Сразу понятно, что объекты — круги, и первое, что приходит на ум (да, спасибо вузу, даже химики они знают, что это такое, и это действительно сразу приходит на ум) - Преобразование Хафа .

Но.

Опять «но»: предметы могут сталкиваться друг с другом, а также быть совершенно не похожими на круги.

Справедливости ради скажу, что я пытался это сделать с помощью преобразования Хафа и библиотеки OpenCV на Python (отличный язык) под Ubuntu. Пространство Хафа в этом случае оказывается слишком неоднозначным (== однородным) и много свободного места вокруг отведено под круги.

Даже после предварительного выбора границ в GIMP и других различных методах.

В общем решил я написать свой почти велосипед. Итак, сначала нам нужно выделить границы.

Попробовав несколько методов (на самом деле их не так много, так что, возможно, я попробовал их все), наиболее приемлемый результат дал метод «Canny Edge Detector» (я не знаю русского слова, не знаю).

меня обыграли), и результат после этого был такой:

Обнаружение округлости изображения (на примере микрофотографии)

После некоторого времени творческих терзаний я наконец понял, что интересующие области закрыты.

Но как узнать, что эти точки образуют замкнутую кривую, а эти нет? Я много времени размышлял над этим вопросом, строил какие-то нечеловеческие расчеты, пытался применить тот математический аппарат, которому меня научили не так давно (и он оказался вполне качественным).

И однажды меня осенило.

Наполнение!!! Нам нужно посмотреть, как работает инструмент заливки в графических проектах с открытым исходным кодом!!! Вот я и открыл для себя алгоритм Поиск в ширину .

Позже я все же использовал для этих целей готовый класс, найденный в Интернете.

Вот как выглядит изображение после заполнения:

Обнаружение округлости изображения (на примере микрофотографии)

Да! Мы выделили все объекты, которые нас интересуют! Вот только внутри них есть какие-то непонятные штрихи.

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

Сказано - сделано! Вот как сейчас выглядит наше изображение (метод «размытия», с использованием стандартной крестообразной матрицы 3х3):

Обнаружение округлости изображения (на примере микрофотографии)

Ура! Готовый! Теперь нам нужно снова воспользоваться алгоритмом BFS и найти координаты центров и крайних точек наших частиц.

В итоге мы получили практически готовую программу для автоматических записей в журнале :) Потому что.

От микроскопа идет обычный USB-кабель, поэтому очень хочется видеть изображение с камеры сразу в программе, сразу фотографировать и распознавать его.

Но это тема моих следующих бессонных ночей.

И вот конечный результат (кликабельно):

Обнаружение округлости изображения (на примере микрофотографии)

— 22.02.2011, 22:05 — перенес в блог «обработку изображений» Теги: #компьютерное зрение #java #псевдокод #распознавание образов #Обработка изображений

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.