与运算:对掩膜的白色区域保留,黑色区域去除
非运算:取反运算,黑变白,白变黑
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('image/pic2.png')
img2 = cv2.imread('image/logo.png')
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 获取二值化图像
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
# 获取二值化图像的反转图像
mask_inv = cv2.bitwise_not(mask)
e1 = cv2.getTickCount() # 获取现在的时间
# get the argument of image
print(img1.shape)
print(img1.size)
print(img1.dtype)
e2 = cv2.getTickCount() # 获取现在的时间
t = (e2 - e1) / cv2.getTickFrequency() # 计算时间
print(t)
roi11 = roi.copy() # 计算后roi会改变,必须用copy,直接赋值占用相同地址,效果不会改变
# 获取掩膜等,还没搞清
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
# 图片相加,在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模。
dst1 = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst1
# 图片按照比例混合
#dst2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
plt.figure(figsize=(11, 11))
b, g, r = cv2.split(img1)
img1 = cv2.merge([r, g, b])
plt.subplot(331), plt.imshow(img1), plt.title('img1')
b, g, r = cv2.split(img2)
img2 = cv2.merge([r, g, b])
plt.subplot(332), plt.imshow(img2), plt.title('img2')
plt.subplot(333), plt.imshow(img2gray, 'gray'), plt.title('img2gray')
b, g, r = cv2.split(roi11)
roi11 = cv2.merge([r, g, b])
plt.subplot(334), plt.imshow(roi11), plt.title('roi11')
plt.subplot(335), plt.imshow(mask, 'gray'), plt.title('mask')
plt.subplot(336), plt.imshow(mask_inv, 'gray'), plt.title('mask_inv')
b, g, r = cv2.split(img1_bg)
img1_bg = cv2.merge([r, g, b])
plt.subplot(337), plt.imshow(img1_bg), plt.title('img1_bg')
b, g, r = cv2.split(img2_fg)
img2_fg = cv2.merge([r, g, b])
plt.subplot(338), plt.imshow(img2_fg), plt.title('img2_fg')
b, g, r = cv2.split(dst1)
dst1 = cv2.merge([r, g, b])
plt.subplot(339), plt.imshow(dst1), plt.title('dst1')
plt.show()