Всем привет! По профессии (строго говоря, будущей профессии) я на самом деле химик.
Сравнительно недавно появились интересные работы и возникла необходимость много работать с цифровым микроскопом, делать большое количество фотографий и определенным образом их обрабатывать.
А именно: найти линейные размеры частиц (обычно круглой формы и первоначально на глаз) и скрупулезно записать их в лабораторный журнал.
Неудивительно, что после первой сотни изображений я начал усиленно задумываться о хоть какой-то автоматизации этого процесса, но был один подвох: я прекрасно знал, что «объектно-ориентированное программирование — это очень хорошо», но.
Но на тот момент я знал только школьный TurboPascal, университетский VB и кодирование на PHP в процедурном варианте.
Покопавшись по форумам, и приняв во внимание тот факт, что за день мне удается работать как минимум на двух операционных системах (Mac/Windows/Ubuntu существуют в эйфорическом симбиозе), я особо не раздумывал и решил писать на Java .
Опуская подробности примерно недели, в свободное время, забивая голову парадигмой объектно-ориентированного программирования и бессонными ночами с мыслями типа «как, черт возьми, это работает», я постараюсь как можно короче рассказать об этом простом и быстрый «алгоритм», родившийся у меня.
Сразу стоит сказать, что он подходит только для достаточно четких изображений.
А вот, кстати, типичный представитель (вернее, примерно его десятая часть), которого нужно обработать:
Сразу понятно, что объекты — круги, и первое, что приходит на ум (да, спасибо вузу, даже химики они знают, что это такое, и это действительно сразу приходит на ум) - Преобразование Хафа .
Но.
Опять «но»: предметы могут сталкиваться друг с другом, а также быть совершенно не похожими на круги.
Справедливости ради скажу, что я пытался это сделать с помощью преобразования Хафа и библиотеки OpenCV на Python (отличный язык) под Ubuntu. Пространство Хафа в этом случае оказывается слишком неоднозначным (== однородным) и много свободного места вокруг отведено под круги.
Даже после предварительного выбора границ в GIMP и других различных методах.
В общем решил я написать свой почти велосипед. Итак, сначала нам нужно выделить границы.
Попробовав несколько методов (на самом деле их не так много, так что, возможно, я попробовал их все), наиболее приемлемый результат дал метод «Canny Edge Detector» (я не знаю русского слова, не знаю).
меня обыграли), и результат после этого был такой:
После некоторого времени творческих терзаний я наконец понял, что интересующие области закрыты.
Но как узнать, что эти точки образуют замкнутую кривую, а эти нет? Я много времени размышлял над этим вопросом, строил какие-то нечеловеческие расчеты, пытался применить тот математический аппарат, которому меня научили не так давно (и он оказался вполне качественным).
И однажды меня осенило.
Наполнение!!! Нам нужно посмотреть, как работает инструмент заливки в графических проектах с открытым исходным кодом!!! Вот я и открыл для себя алгоритм Поиск в ширину .
Позже я все же использовал для этих целей готовый класс, найденный в Интернете.
Вот как выглядит изображение после заполнения:
Да! Мы выделили все объекты, которые нас интересуют! Вот только внутри них есть какие-то непонятные штрихи.
Я только начал думать, как решить этот вопрос, и тут (прямо в тот же день) наткнулся на очень своевременное статья на Хабрахабре о математической морфологии (которая сейчас недоступна обычному пользователю).
Сказано - сделано!
Вот как сейчас выглядит наше изображение (метод «размытия», с использованием стандартной крестообразной матрицы 3х3):
Ура! Готовый! Теперь нам нужно снова воспользоваться алгоритмом BFS и найти координаты центров и крайних точек наших частиц.
В итоге мы получили практически готовую программу для автоматических записей в журнале :) Потому что.
От микроскопа идет обычный USB-кабель, поэтому очень хочется видеть изображение с камеры сразу в программе, сразу фотографировать и распознавать его.
Но это тема моих следующих бессонных ночей.
И вот конечный результат (кликабельно):
— 22.02.2011, 22:05 — перенес в блог «обработку изображений»
Теги: #компьютерное зрение #java #псевдокод #распознавание образов #Обработка изображений
-
Нужна Ли Вам Полная Хинтинг Типов В Php?
19 Oct, 24 -
Беспроводная Клавиатура Logitech Для Wii
19 Oct, 24 -
Платный Android Market Приходит В Россию
19 Oct, 24 -
История Visual Studio. Часть Ii
19 Oct, 24