Python 在另一幅图像上粘贴图像时,如何保持前景图像的透明?

Python 在另一幅图像上粘贴图像时,如何保持前景图像的透明?,python,arrays,numpy,opencv,python-imaging-library,Python,Arrays,Numpy,Opencv,Python Imaging Library,我正在尝试使用OpenCV/Pillow将一个图像置于另一个图像之上,同时保持前景图像透明。如果你看,你可以看到一切都进展顺利,除了我不知道如何保持图像的透明 我尝试在我的程序中通过@fireant实现,但似乎没有任何效果 如何正常执行index.py,但保持前景png透明? 图像 index.py 使用cv2.IMREAD\u UNCHANGE标志读取dot\u transparent.png,则您拥有alpha通道(否则,您只有3个通道) img=cv2.imread('faces.jp

我正在尝试使用OpenCV/Pillow将一个图像置于另一个图像之上,同时保持前景图像透明。如果你看,你可以看到一切都进展顺利,除了我不知道如何保持图像的透明

我尝试在我的程序中通过
@fireant
实现,但似乎没有任何效果

如何正常执行
index.py
,但保持前景png透明?

图像

index.py
使用
cv2.IMREAD\u UNCHANGE
标志读取
dot\u transparent.png
,则您拥有alpha通道(否则,您只有3个通道)

img=cv2.imread('faces.jpg'))
to_replace=cv2.imread('dot_transparent.png',cv2.imread_未更改)
#样本眼检测
ex,ey,ew,eh=1600200200
调整大小的替换=cv2。调整大小(到替换(eh,ew))

img[ey:ey+eh,ex:ex+ew]=np。其中(resized_replace[…,-1::][p>因为每个像素都有特定的alpha值,所以我会采用另一种方法,实现像素级,忽略最终图像中的任何alpha通道

我借用了以下几行:

导入cv2
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#阅读图像
img=cv2.imread('image.jpg')
dot=cv2.imread('dot\u transparent.png',cv2.imread\u未更改)
#手动操作一只眼睛
ex,ey,ew,eh=1430149040400
点=cv2。调整大小(点(eh,ew))
#准备像素级alpha混合
点α=点[…,3]/255.0
点α=np.重复(点α[…,np.新轴],3,轴=2)
点=点[…,:3]
#像素级alpha混合
img[ey:ey+eh,ex:ex+ew,:]=img[ey:ey+eh,ex:ex+ew,:]*(1-dot_alpha)+dot*dot_alpha
#输出
plt.图(figsize=(9,9))
plt.imshow(img[…,[2,1,0]]
plt.紧_布局()
plt.show()
这就是输出:

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
Matplotlib:3.3.4
NumPy:1.20.1
OpenCV:4.5.1
----------------------------------------

是否可以保持所有透明度?不仅仅是去除黑色?即尝试增加阈值,例如50。请参阅更新的答案。谢谢!这看起来很棒,但我尝试在代码中实现您的解决方案,但收到了
值错误:操作数无法与形状(22,22,3)(10001000,3)一起广播
我如何在
index.py
中实现您的解决方案?显然,您还没有调整“点”图像的大小,这具有形状
(1000,1000,3)
以适合找到的ROI,它似乎具有形状
(22,22,3)
。如果看不到更新的代码,就无法提供帮助。请回答您的问题,并将更新的代码放在现有问题下方。
import os
import numpy
import cv2
from PIL import Image
from os.path import join, dirname, realpath
import json

def upload_files():
    #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
    face_cascade = cv2.CascadeClassifier('/Users/matt/Python/LazerEyes/haarcascade_eye.xml')

    #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml
    eye_cascade = cv2.CascadeClassifier('/Users/matt/Python/LazerEyes/haarcascade_eye.xml')

    img = cv2.imread('new.png')
    img_to_place = cv2.imread('dot_transparent.png')

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    gray_to_place = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    img_h, img_w = gray.shape
    img_to_place_h, img_to_place_w = gray_to_place.shape

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            resized_img = cv2.resize(img_to_place, (eh, ew), interpolation = cv2.INTER_AREA)
            resized_img_h, resized_img_w, _ = resized_img.shape

            roi_color[ey:ey+resized_img_h, ex:ex+resized_img_w, :] = resized_img
img = cv2.imread('faces.jpg')
to_replace = cv2.imread('dot_transparent.png', cv2.IMREAD_UNCHANGED)
# sample eye dectection
ex,ey,ew,eh = 1600, 1600,200,200

resized_replace = cv2.resize(to_replace, (eh,ew))

img[ey:ey+eh, ex:ex+ew] = np.where(resized_replace[...,-1:]<50, 
                                   img[ey:ey+eh, ex:ex+ew],
                                   resized_replace[...,:-1]
                            )

# show with imshow
plt.imshow(img[...,::-1])