我想把OpenCV的标志放到另一幅图像上,如果使用相加add函数,颜色会改变,使用addWeighted函数会得到透明效果,怎么做呢?
代码语言:javascript复制import cv2 as cv
# import numpy as np
img1 = cv.imread('C:\Users\dragon\Pictures\Camera Roll\ali.jpg')
img2 = cv.imread('C:\Users\dragon\Pictures\Camera Roll\OpenCV_logo.png')
rows,cols,channels = img2.shape#获取img2图像的长、宽和RGB通道数
roi = img1[0:rows, 0:cols]#在img1中截取和img2同样像素大小的图像
cv.imshow('roi',roi)
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)#获取img2的灰度图
ret, mask = cv.threshold(img2gray, 175, 255, cv.THRESH_BINARY)
# 图像二值化
# 第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
# • cv2.THRESH_BINARY(黑白二值)
# • cv2.THRESH_BINARY_INV(黑白二值反转)
# • cv2.THRESH_TRUNC (得到的图像为多像素值)
# • cv2.THRESH_TOZERO
# • cv2.THRESH_TOZERO_INV
mask_inv = cv.bitwise_not(mask)#将黑白颜色反转
cv.imshow('mask', mask)
cv.imshow('mask_inv', mask_inv)
img1_bg = cv.bitwise_and(roi, roi, mask = mask_inv)
#图像按位与操作,只有mask_inv[i]不等于0时,才会进行"and"运算
cv.imshow('img1_bg', img1_bg)
img2_fg = cv.bitwise_and(img2, img2, mask = mask)
cv.imshow('img2_fg', img2_fg)
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()
代码如上,我把过程中的图像截图出来,这样会更好理解 ali.jpg原图:
OpenCV_logo.png原图:
运算后的图:
运算中间的图,图片框的标题对应程序中的图: