2015-06-19 3 views
5

В настоящее время я делаю проект на основе методологии, описанной в этой статье: Camera calibration from a single night sky imageметоды OpenCV/Обработка изображений, чтобы найти центры ярких пятен на изображении

Как новичок в области компьютерного зрения, я не достаточно понять, как я могу реализовать метод, используемый в документе, чтобы найти центр всех ярких пятен (светильников) внутри изображения, в частности, в параграфе в разделе 4.1:

Окружающий участок размером 15 × 15 пикселей (рисунок 1 (a)), повышается дискретизация с помощью данного коэффициента (рисунок 1 (c)) и вычисляется соответствующая карта градиента (рис. 1 (d)). Начиная с самой яркой области, порог серого значения уменьшается, пока функция энергии не будет максимизирована. Энергетическая функция определяется как сумма градиентов границы и нормирована по длине границы (рис. 1 (e)). Это приводит к сегментированному изображению звезды, показанному на рисунке 1 (f). Сегментация гарантирует, что взвешенный алгоритм центра тяжести [11] дает надежную оценку.

upsampled image after gradient function applied after energy-function applied segmented image

Из моего понимания, я думаю, что я могу сделать функцию градиента лапласиане/Собел на дискретизированном изображении, но после того, что я не слишком уверен, как я могу выполнить энергию функции и произвести сегментированное изображение. Также я хотел бы понять, как реализовать алгоритм взвешенного центра тяжести, чтобы найти центр яркого пятна, используя openCV или другую библиотеку python.

Очень ценно, если кто-либо из вас может предоставить некоторые огни на этом.

Спасибо и приветствую.

ответ

4

Главное, что нужно убрать, это energy function, используемый в этом контексте - любая функция, которая используется для решения проблемы максимизации. Здесь энергетическая функция представляет собой сумму градиентов/производных/разностей (т. Е. «Обнаруженная граница вероятности» в данном случае).

Поскольку у вас, кажется, нет алгоритмический фон, я предлагаю вам прочитать breadth-first search (помните, что изображение представляет собой очень специфический тип графика, где каждый ребро является пикселем, подключенным к соседним), recursion и floodfill.

  1. вверх/уменьшения масштаба изображения
  2. Run горизонтальные и вертикальные фильтры Собели. Объедините полученные изображения в grad_img = max_per_pixel (sobel_horiz, sobel_vert).
  3. Для каждого пятна 15x15 пикселей найдите самое яркое пятно. Это seed звезды.
  4. Начните с 1x1 region, который состоит из seed. Продолжайте добавлять соседние пиксели к этому region (рекомендуем пройти по ширине). Вычислить энергию по сумме значений пикселей в grad_img с координатами пикселей границ region. Если энергия выше, чем энергия предыдущей итерации, новый пиксель добавляется к region. Если нет, пиксель отклоняется.
  5. Поиск центра тяжести замкнутого контура или набора пикселей не является трудной задачей.Либо сделайте это по математическому определению (сумма координат x и y всех пикселов в области, разделенных областью), либо сделайте это, используя моменты изображения (cv :: моменты example).

Мое решение немного отличается от их решения. Они фактически запускают алгоритм заливки, который заполняет все пиксели яркости [порог, 255], вычисляет энергию func, уменьшает порог, полоскание и повторение, останавливаясь, когда они максимизируют энергетическую функцию. Обратите внимание, что их алгоритм очень неэффективен, так как они эффективно до 255 заливок для каждой предварительно обнаруженной звезды по сравнению с 1 потоком заливки в моем предложении, и это может быть проблемой производительности на практике.

+0

Привет, Бойко, спасибо за быстрый ответ. Просто хочу уточнить, вы сказали: «Если энергия выше энергии предыдущей итерации, новый пиксель добавляется в область», к которой относится предыдущая итерация, на которую я должен ссылаться? Значит ли это, начиная с семени, я проверяю каждый из 8-соседей на пиксельные значения семени. Если все соседи добавлены, я продолжаю итерацию каждого из 15-соседей (или всех пикселов границ) и проверку на сумму 8-соседних ранее и так далее? – LawrenceH

+0

Довольно многое из того, что вы сказали, кроме вашей второй итерации, возможно, не над квадратом, потому что сбой некоторых из 8 пикселей в область. –

+0

Хотя, теперь я читал, что на самом деле они делают, просто запускают алгоритм заливки, который заполняет все пиксели яркости [порог 255], вычисляет энергию func, уменьшает порог, промывает и повторяет, останавливаясь, когда они максимизируют энергетическую функцию. Обратите внимание, что их алгоритм очень неэффективен, так как они эффективно доводят до 255 флудов для каждой предварительно обнаруженной звезды. –