2015-11-01 2 views
1

У меня есть цикл, чтобы запустить через образ и сделать заливку каждые 20 пикселей:cv2.floodFill() висит с некоторыми входами

h, w = image.shape[:2] 
mask = np.zeros((h+2, w+2), np.uint8) 
mask[:] |= 0 
flags = 4 
flags |= cv2.FLOODFILL_FIXED_RANGE 
for x in range(20,image.shape[1]-20): 
    for y in range(20,image.shape[0]-20): 
     if x%20 == 0 and y%20 == 0: 
      print x, y 
      flooded = image.copy() 
      print 'starting flood fill' 
      minVal = min(image.item(x,y,0),image.item(x,y,1),image.item(x,y,2)) 
      maxVal = max(image.item(x,y,0),image.item(x,y,1),image.item(x,y,2)) 
      size = cv2.floodFill(flooded,mask,(x,y),(0,)*3, (40,)*3, (40,)*3, flags)[0] 

Хотя в некоторых точках cv2.floodFill() никогда не завершится. Если я опускаю lo и hi границы, он способен обрабатывать дальше, но иногда будет зацикливаться. У кого еще возникла эта проблема?

С этим изображением он висит на пиксель (40,400): /Users/Justin/Downloads/images/2015-07-25-12-53-17-img1.png

ответ

1

Вы должны повторно инициализировать mask внутри ваших циклов, как каждый раз, когда floodFill модифицирует его. Также вы можете улучшить производительность, отбросив операторы %. И исправить ошибку, image.item(x,y,, это должно быть image.item(y,x,.

for x in range(20,image.shape[1]-20, 20): 
    for y in range(20,image.shape[0]-20, 20): 
     print x, y 
     mask[:] = 0 
     flooded = image.copy() 
     print 'starting flood fill' 
     size = cv2.floodFill(flooded,mask,(x,y),(0,)*3, (40,)*3, (40,)*3, flags)[0] 
+0

Я получаю тот же вопрос висит, и я не делаю этого в op, как OP. Он висит, если lo и hi ограничены слишком большими числами. – Chris

0

Я нашел фактическую причину вашего повешения.

Оказывается, что вот и привет оценки не должны вызывать выборочный цвет в целевой точке превышает 254.

target_point = (25, 50) 
size = cv2.floodFill(flooded,mask, target_point,(0,)*3, (40,)*3, (40,)*3, flags)[0] 

Если значения в (25,50) составляет 253, то максимум для вот и привет границы 1.

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

val = img_f.item(target_point[1], target_point[0]) 
bounds = min(254-val, INSERT_LO_HI_BOUND_HERE) 
Смежные вопросы