2016-06-02 4 views
1

Я пытаюсь извлечь объекты из изображения, вычислив минимум данного окна вокруг изображения и вычитая его из исходного значения пикселя. Однако это происходит очень медленно, так как я повторяю всю картину. Есть ли оптимизированный способ сделать это?OpenCV: Как рассчитать минимальное значение для окна вокруг центрального пикселя?

f = np.asarray(img.shape) 
    for i in range(img.shape[0]): 
     for j in range(img.shape[1]): 
      if mask[i][j]==255: 
       row,col = i,j 
       begin_row = row - 4 
       end_row = row + 4 
       begin_col = col - 4 
       end_col = col + 4 
       if begin_row < 0: 
        begin_row = 0 
       if begin_col < 0: 
        begin_col = 0 
       if end_col > img.shape[1]: 
        end_col = img.shape[1] 
       if end_row > img.shape[0]: 
        end_row = img.shape[0] 
       window = img[begin_row:end_row, begin_col:end_col] 
       curr = img.item(row, col) 
       f.itemset((row, col), curr - window.min()) 
+0

использовать 'cv2.minMaxLoc' с вашей маской в ​​качестве параметра входной маски – Micka

ответ

1

Я не уверен, если я понимаю вашу цель правильно:

  • входного изображения I
  • для каждого пикселя p в I вычесть минимум окружающих окон (в том числе исходного пикселя)

Затем вы можете использовать морфологический фильтр erode, который действует как mi nimum фильтр:

I_new(p) = I(p) - erode(I, p, window) 

где вы параметризировать erode иметь правильный размер окна и якорь.

Что касается реальной реализации, вы можете использовать версию python opencv с its erode function. Это быстро, так как она реализована на C++/C. Это может выглядеть так (непроверенный):

import cv2 
import numpy as np 

img = cv2.imread('path/to/image.jpg') 

kernel = np.ones((5,5),np.float32) 
dst = img - cv2.erode(img,kernel) 

Самого главное: Избегайте пробегает по массивам изображений с петлями питона - это всегда может быть только медленной.

+0

Я не хочу среднего значения окна, я хочу минимальное значение ' I_new (p) = I (p) - min (I, p , window) ' –

+0

Мой плохой, был написан как средний, а не как минимальный вопрос. –

+0

Indranil Dutta, я сменил образец на 'erode', так как это действует как минимальный фильтр – DomTomCat

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