Чтобы объединить зоны, вы хотите взять самый яркий пиксель в каждой точке, что даст вам объединенные зоны на черном фоне:
# "zones" will contain all the zones combined together by choosing the brightest pixel at each point
zones = np.maximum.reduce([zone11, zone12])
Теперь мы хотим найти все места, где любой из цветовых каналов ненулевой, то есть все не черные области.
# "alpha" will be True where the zones are activated
alpha = np.any(zones>0, axis=2)
Затем для окончательного результата вы хотите выбрать объединенные зоны, где они активны, и лодку в другом месте:
# For the final result, pick the zones at locations where they contain stuff, and the boat anywhere else
res = np.where(alpha[...,np.newaxis], zones, boat)
# Save result to disk
cv2.imwrite('result.png', res)
Что касается выполнения всего этого каждую секунду, вы просто делаете копию изображения лодки, которое вы загрузили за пределами l oop в начале программы создайте зоны и поместите их в копию:
# Load boat once at startup
boat_orig = cv2.imread("boat.png")
# Main loop
while not sunk:
boat = boat_orig.copy()
zones = np.maximum.reduce([zone11, zone12])
alpha = np.any(zones>0, axis=2)
res = np.where(alpha[...,np.newaxis], zones, boat)
Эти 4 строки во внутреннем l oop проходят на моей машине около 400 мс, и 200 мс это строка:
alpha = np.any(zones>0, axis=2)
, которую вы можете найти, вы можете изменить на:
alpha = zones[...,2]
, потому что в красном канале всегда будет что-то (если ваши зоны оранжево-красного цвета), и это уменьшает 200 мс до 1 мс.