6

=== решаемые ===Простой объект распознавания

Спасибо за ваши комментарии и предложения. Работая над алгоритмом flood_fill, приведенным в книге Beginning Python Visualization (глава 9 - Обработка изображений), я реализовал то, что я хотел. Я могу подсчитать объекты, получить прямоугольники для каждого объекта (поэтому высота и ширина), и, наконец, может построить массивы NumPy или матрицы для каждого из них.

Хотя это не оптимизированный подход, он делает то, что я хочу. Исходный код (lab2.py) и файл png (lab2-particle.png), который я использую, были помещены под http://code.google.com/p/ccnworks/source/browse/#svn/trunk/AtSc450.

Вам необходимо установить NumPy и PIL, а matplotlib - просмотреть гистограмму. Ядро кода лежит внутри функции objfind, где происходит действие основного рекурсивного поиска объекта. далее

Одно обновление:

SciPy-х ndimage.label() делает именно то, что я хочу тоже.

Приветствия для Давид-Warde Фарли и Zachary Пинкус из NumPy и SciPy списки рассылки для указания этого права в мои глаза :)

=========== ==

Здравствуйте,

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

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

Как я могу легко решить эту проблему? (Предпочтительно с использованием Python)

Спасибо.

ПРИМЕЧАНИЕ. В моем вопросе я имею в виду каждый конкретный подключенный пиксель как объекты или объекты. Мое намерение извлечь их и создать представления массива NumPy, как показано ниже. (Здесь я использую верхний левый объект, если существует пиксель, используйте 1, если не использовать 0. Эта форма объекта 3 на 3, что соответственно составляет 3 пикселя высотой на 3 пикселя. Это проекции реальных частиц льда на 2D-домен , в предположении их принадлежность к сферическому и эквивалентному радиусу (высота + ширина)/2, а затем некоторой окалина --from пикселей в фактические размеры и объем вычислений будут следовать)

import numpy as np 

np.array([[1,1,1], [1,1,1], [0,0,1]]) 

array([[1, 1, 1], 
     [1, 1, 1], 
     [0, 0, 1]]) 

Вот участок от изображение, которое я собираюсь использовать.

screenshot http://img43.imageshack.us/img43/2327/particles.png

+5

Простые распознавания объектов звучат как противоречие в терминах для меня. – Joren

+0

Что бы вы предложили в качестве альтернативы? –

+3

Пожалуйста, не говорите «разрешено» в вашем вопросе. Либо принимайте лучший ответ, либо отвечайте на свой вопрос и принимайте это. – Soviut

ответ

2

OpenCV имеет интерфейс Python, который вы могли бы оказаться полезными.

+0

Нашли это: http://opencv.willowgarage.com/documentation/python/pattern_recognition.html Однако несколько сбивает с толку, и пример не очень полезен. –

5
  1. Сканирование каждого квадрата (например,от верхнего левого, слева-направо, сверху-вниз)

  2. Когда вы попали синий квадрат, то:

    а. Запишите этот квадрат в качестве местоположения нового объекта

    b. Найти все другие смежные синие квадраты (например, глядя на соседей этой площади, и соседей этих соседей, и т.д.) и пометить их как часть одного и того же объекта

  3. Продолжить сканирование

  4. Когда вы найдете еще один синий квадрат, проверьте, является ли он частью известного объекта, прежде чем перейти к шагу 2; в качестве альтернативы на этапе 2b, стереть любой квадрат после того, как вы связали его с объектом

+0

Я думал реализовать что-то подобное, что вы упомянули здесь. Спасибо за то, что выложил яснее, чем я :) –

+0

С некоторой помощью я написал простую реализацию flood_fill и могу подсчитать количество объектов (тени ледяных частиц) на данном изображении. И, да, это включает рекурсию, как я и ожидал. Теперь я хочу иметь возможность создавать простые массивы numpy, представляющие каждый объект. (как это было дополнительно продемонстрировано в моем вопросе). В конце концов, я собираюсь добавить все эти массивы в массив, где позже я могу просто перебрать и получить свои формы. Формы важны, потому что я буду использовать их для роста и ширины объектов ледяной частицы. –

3

Глядя на изображение, которое вы при условии, все, что нужно делать дальше, чтобы применить простую region growing algorithm.

Если бы я использовал MATLAB, я хотел бы использовать bwlabel/bwboundaries функции. Я считаю, что есть эквивалент функции где-то в Numpy или использовать OpenCV с питона обертках как предложено @kwatford

+0

Пакет SciPy имеет аналогичную функцию маркировки (http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.measurements.label.html#scipy.ndimage.measurements.label), которую я мог бы обозначить всем пиксели правильно, используя его. Но это решает только первую часть проблемы. Я должен различать каждый объект отдельно. К сожалению, для этого нет никакой функции. Нужно писать :) –

+0

Как я понимаю, каждый синий объект в изображении является сущностью, не так ли? Затем, помещая все пиксели в регионы, вы просто выбираете все пиксели, помеченные как один, а затем те, которые обозначены как два, и т. Д., Чтобы получить каждый объект ... Следующим шагом будет извлечение некоторых функций для каждого объекта (границы, форма, площадь, размер, ...), которые будут использоваться в контролируемой задаче классификации. – Amro

+0

Я разъяснил свое использование сущностей в моем вопросе в разделе ПРИМЕЧАНИЕ. Пока что все, что мне нужно сделать, это получить прямоугольник или квадрат границы для некоторых случаев ширины и высоты для каждого объекта. –

3

Я использовал, чтобы сделать этот вид анализа на микрофотографиях и в конечном итоге положить все, что нужно в обработке изображений и пакет анализа, написанный на C, управляемый через Tcl. (Он работал только с 512 x 512 изображениями, что объясняет, почему 512 так часто появляются. Имеются изображения с выделенными пикселями разных размеров, но большая часть работы была выполнена с 8-битными пикселями, что объясняет, почему существует 0xff и максимальное значение 254 на изображении.)

Вкратце, «zz» в начале команд Tcl отправляет оставшуюся часть строки в парсер пакета, который вызывает соответствующую процедуру C с данными аргументами. Сразу после «zz» - это аргумент, указывающий ввод и вывод команды. (Там может быть несколько входов, но только один вывод.) «R» означает 512 x 512 x 8-битное изображение. Третье слово - это имя вызываемой команды; «Графы» маркируют изображение, как описано в тексте ниже. Итак, «zz rr graphs» означает «Вызвать парсер ZZ; введите r-образ в команду graphs и верните r-образ. ' Остальная часть командной строки Tcl указывает, какой из предварительно выделенных изображений использовать. (Изображение «g» является ROI, то есть областью интереса, изображением, почти все ZZ ops выполняются под контролем ROI.) Итак, «r1 r1 g8» означает «Использовать r1 в качестве входных данных, используйте r1 в качестве вывода (то есть маркировать входное изображение) и выполнять операцию, где соответствующий пиксель на изображении g8 --- то есть r8, используемый как ROI ---, равен> 0.

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

Пример 6. Функции подсчета.

Проблема

Counting является общей задачей. Рассчитываемые предметы называются «функциями», и обычно необходимо тщательно готовить изображения, чтобы функции соответствовали друг другу с вещами, которые являются реальными объектами, которые нужно учитывать. Здесь, однако, мы игнорируем подготовку изображения и рассматриваем вместо этого механику подсчета.Первое упражнение по подсчету состоит в том, чтобы узнать, сколько функций находится на изображениях в каталоге ./cells?

подход

Во-первых, давайте определим «особенность». Особенностью является наибольшая группа «установленных» (ненулевых) пикселей, все из которых могут быть достигнуты путем перехода от одного набора пикселов к другому вдоль маршрутов с севера на юго-восток-запад (вверх-вниз-право-слева), начиная от заданного пикселя набора. Команда zz, которая обнаруживает и маркирует такие объекты на изображении, представляет собой «zz rr-графики R: src R: dest G: ROI», так называемый, потому что математический термин для такой функции является «графиком». Если все пиксели на изображении установлены, то на изображении есть только один граф, но он содержит 262144 пикселей (512 * 512). Если пиксели установлены и очищены (равны нулю) в шаблоне шахматной доски, , тогда будут графики 131072 (512 * 512/2), но каждый будет содержать только один пиксель. Вкратце объясняется, что «zz rr graphs» начинается в верхнем левом углу изображения и сканирует каждую последующую строку слева направо, пока не найдет заданный пиксель, а затем найдет все установленные пиксели, прикрепленные к этому через север, юг, восток , или западные границы («4-подключенные»). Затем он устанавливает все пиксели в этом графе равными 1 (0x01). После нахождения и маркировки графика 1 он снова начинает сканирование в пикселе после того, где он впервые открыл график 1, на этот раз игнорируя любые пиксели, которые уже принадлежат графику. Первые 254 найденных графа будут отмечены однозначно; все найденные после этого графики будут отмечены значением 255 (0xff) и поэтому не могут отличаться друг от друга. Ключом к тому, чтобы точно подсчитывать любое количество графиков, является обработка каждого изображения поэтапно, то есть поиск количества графиков на изображении и, если число больше 254, стереть только 254 найденных графика, повторяя до тех пор, пока не будет найдено 254 или меньше графов. Язык Tcl предоставляет средства для настройки управления этой операцией.

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

zz ur to $inDir/$img r1 
zz rr graphs r1 r1 g8 

Далее мы обнулить некоторые переменные, чтобы следить за подсчеты, а затем использовать команду «ра макс», чтобы выяснить, были ли обнаружены более 254 графиков.

set nGraphs [ zz ra max r1 a1 g1 ] 

Если nGraphs делает равное 255, то 254 точно подсчитаны графики должны быть добавлены к общей сумме, графики от 1 до 254, должны быть удалены, и число повторяется столько раз, сколько потребуется, чтобы уменьшить количество графиков ниже 255.

while {$nGraphs == 255} { 
    incr sumGraphs 254 
    zz rbr lt r1 155 r1 g1 0 255 
    set sumGraphs 0 
    zz rr graphs r1 r1 g8 
    set nGraphs [ zz ra max r1 a1 g8 ] 
} 

Когда «а» цикл завершается, переменная nGraphs должна иметь несколько меньше, чем 255, то есть, ряд точно подсчитанные график; это добавляется к увеличению общего количества функций в серии изображений.

incr sumGraphs $nGraphs 

После цикла обработки распечатайте общее количество функций, найденных в этой серии.

puts “Total number of features in $inDir \ 
images $beginImg through $endImg is $sumGraphs.” 

После цикла обработки распечатайте общее количество функций, найденных в этой серии.

+0

Это очень длинный ответ. Потребуется некоторое время, чтобы понять ваши объяснения :) –

+0

Обратите внимание, что я добавил параграф 2 как миниатюрное введение в синтаксис командной строки Tcl пакета. Это может помочь вашему «схватыванию». Кстати, в руководстве есть другие примеры, которые показывают, как подготовить изображения с помощью морфологических операций, а затем, после нахождения и подсчета функций, делать такие вещи, как делать их распределение по размерам. Я никогда серьезно не пытался приспособить его к Python, хотя это было на мой взгляд, чтобы сделать это в течение некоторого времени. – behindthefall

+0

Также BTW: «Графы» в основном использует алгоритм из Graph Gems, Vol.I, стр.721, Paul Heckbert. – behindthefall

2

Connected component analysis может быть тем, что вы ищете.

+0

Я знал, что для этой техники должен быть новый :) Спасибо за указатели. Оба pygraph (http://code.google.com/p/python-graph/) и opencv с обложками Python имеют определенную поддержку для этого алгоритма, однако их использование не очень понятно для меня. Вы использовали какие-либо из этих функций? –

Смежные вопросы