Python cv2 & numpy - объединение двух изображений - PullRequest
1 голос
/ 10 апреля 2020

У меня есть изображение лодки, и мне нужно заполнить цветом отдельные зоны в соответствии со значением датчика. До этого момента я создал две отдельные зоны в формате .png, и я хочу показать их одновременно, поместив их на базовое изображение лодки c. Boat image

Мой код:

import cv2
import numpy as np
from PIL import Image
import time

bg = cv2.imread("boat.png")
#RGB = np.zeros((2178, 2904, 3), dtype=np.uint8)
#zone11
zone11 = cv2.imread(r'C:\Users\Lenovo\Anaconda3\Programy\Obszary\11.png')
#zone12
zone12 = cv2.imread(r'C:\Users\Lenovo\Anaconda3\Programy\Obszary\12.png')

combined = np.maximum.reduce([zone11, zone12])
cv2.imwrite('combined.png',combined)
cv2.imshow('combined',combined)
#cv2.imshow('bg',bg)
cv2.waitKey(5)
time.sleep(5)
cv2.destroyAllWindows();

Проблема в том, что np.maximum.reduce дает мне обе зоны на одном изображении, но с черным фоном и выдает ошибку Кернелла ... Both zones

Как сохранить их без черного фона? А как их поставить на изображение основы c? В будущих зонах будет отображаться один раз в 1 сек c, и они будут отличаться в каждой последовательности, как я могу вставить зоны в одну последовательность и удалить их перед следующей?

Буду признателен за любую помощь, Я очень новичок в графике и python.

Изображения Imgur: 1. Лодка https://imgur.com/cA9slkZ 2. Комбинированная https://imgur.com/lKxLxgN 3. Зона 12 https://imgur.com/zIVgoZh 4. Зона 11 https://imgur.com/PMUGWW6

1 Ответ

1 голос
/ 10 апреля 2020

Чтобы объединить зоны, вы хотите взять самый яркий пиксель в каждой точке, что даст вам объединенные зоны на черном фоне:

# "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)

enter image description here

Что касается выполнения всего этого каждую секунду, вы просто делаете копию изображения лодки, которое вы загрузили за пределами 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 мс.

...