CV2 добавить 2 изображения без прозрачности Python - PullRequest
0 голосов
/ 13 марта 2020

Я работаю над проектом обработки изображений. У меня есть 2 изображения RGB, и я хотел бы создать новое, перекрывая 2 входных изображения.

Это мои 2 входных изображения:

Crack enter image description here

Я использую cv2 метод add для достижения этой цели. Но результат не является ожидаемым результатом ...

Результат выглядит следующим образом:

enter image description here

Я не хочу есть прозрачность на моей красной полосе. Я хотел бы что-то непрозрачное, которое покрывает трещину на изображении 1.

Вот мой код:

img1 = cv2.imread(r"C:\Users\francois.bock\Desktop\crack.jpg")
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

img2 = cv2.imread(r"C:\Users\francois.bock\Desktop\line.png")
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

# Adding two images
add = cv2.add(img1, img2)

#Display the image
img = PImage.fromarray(add)
img.show()

Я также наивно пытался добавить 2 таких изображения:

add = img1 + img2
add = add.astype(np.uint8)

Но результат еще более странный.

Я также использовал метод cv2 "addWeighted", но он также дает прозрачную полосу.

Так что мой вопрос, есть ли простой способ добавить 2 изображения без прозрачности? Заранее спасибо.

1 Ответ

1 голос
/ 13 марта 2020

Вы можете сделать это с прямыми Numpy:

import numpy as np
import cv2

a = cv2.imread('a.jpg')
b = cv2.imread('b.png') 

# Make "a" red anywhere b>0
a[ np.any(b>0,axis=-1) ] = [0,0,255] 

enter image description here

Если у вас есть синие и зеленые или любые другие цветные линии Вы также можете использовать эту картинку:

# Anywhere image "b" is not black, use image "b", else use image "a"
result = np.where(np.any(b>0,axis=-1,keepdims=True), b, a)   

enter image description here

...