2012-10-02 3 views
1

noob здесь.Область множественных блобов в двоичном изображении python

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

В настоящий момент я повторяю каждый подключенный пиксель, увеличивая переменную, чтобы получить область каждого блока (см. Код ниже). Затем я обрабатываю только самые большие капли, как требуется, однако этот метод итерации пикселей очень медленный в python.

for i in range(1, objectCount): 
      zm=0.0 
      for h in range(im.height): 
       for w in range(im.width): 
        pixVal = cv.Get2D(im, h, w) 
        if (pixVal[0] == i): 
         zm=zm+1 
      objectArea.append([int(zm)]) 

Есть ли более быстрый способ сделать это?

ответ

2

Вот код для замены выше:

hist = cv.CreateHist([255], cv.CV_HIST_ARRAY, [[0,255]], 1) 
cv.CalcHist([im] , hist)   
for h in range(255): 
    zm = cv.QueryHistValue_1D(hist, h) 
    objectArea.append([int(zm)]) 
1

Поскольку ваши значения пикселей соответствуют идентификаторам blob, вы можете рассчитать гистограмму вашего изображения и выбрать только 5 самых высоких столбцов, чтобы избежать всех этих итераций пикселей.

Для расчета гистограммы вы можете использовать метод OpenCV .

Here это пример использования.

+1

Приветствия Muffo, это briliantly умная идея! Я сохраняю итерацию через пиксели, которые являются наиболее трудоемкими задачами. – PDF417

+0

Спасибо! Если вы считаете, что мой ответ решает вашу проблему, отметьте его как правильно :) – Muffo

+1

Спасибо .... просто сделал. – PDF417

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