在编写代码之前我们需要理清思路:
1.引入图片
2.设计一个LOGO的图片
3. 规划一下LOGO希望放在那个位置,在添加的位置变为黑色
4. 利用add方法,将logo和图片叠加在一起
- import cv2
- import numpy as np
-
- # 导入图片
- dog = cv2.imread("dog.png")
-
-
- # 创建LOGO
- logo = np.zeros((200, 200, 3), np.uint8) # 一个纯黑LOGO背景
-
- # 绘制LOGO
- logo[20:120, 20:120] = [255, 0, 0]
- logo[80:180, 80:180] = [0, 255, 0]
-
-
- cv2.imshow("logo", logo)
- cv2.imshow("dog", dog)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
输出的LOGO图像如图所示:
接下来我们计划将LOGO放在小狗图片的左上角。
在OpenCV位运算中,还存在掩码(mask)操作。
例如cv.bitwise_and(src1, src2, dst, mask)
位运算,前面两个图片先做一个与运算,与完之后再与掩码做一个与运算。
如果结果为True,则显示前面与完结果之后的值
如果结果为False,则统一为0
且无论是and、or、not、xor在OpenCV中与掩码的操作都为与运算。
- roi = dog[0:300, 0:300] # 浅拷贝
-
- # roi与m进行与操作
- tmp = cv2.bitwise_and(roi, roi, mask=m) # roi与roi与操作之后还是roi,
- # 在于mask进行与运算,如果结果为True,返回原图,如果为False,返回黑色。
- cv2.imshow("tmp", tmp)
此时发现得到的tmp与logo进行add运算,即可把logo嵌入。
- dst = cv2.add(tmp, logo)
- cv2.imshow("dst",dst)
最后我们再在dog上还原图片
dog[:300, :300] = dst
最终我们可以得到一下带LOGO的小狗图片
综合演示代码如下所示:
- import cv2
- import numpy as np
-
- # 导入图片
- dog = cv2.imread("dog.png")
-
- # 创建LOGO
- logo = np.zeros((300, 300, 3), np.uint8) # 一个纯黑LOGO背景
-
- # 绘制LOGO
- logo[20:120, 20:120] = [255, 0, 0]
- logo[80:180, 80:180] = [0, 255, 0]
-
- # 创建一个掩码
- mask = np.zeros((300, 300), np.uint8) # 创建一个二维的与LOGO一样的的掩码
- mask[20:120, 20:120] = 255
- mask[80:180, 80:180] = 255
-
- cv2.imshow("mask", mask)
- m = cv2.bitwise_not(mask) # 将创建的掩码取反
- cv2.imshow("m", m)
-
- # 选择dog添加LOGO的位置
- roi = dog[0:300, 0:300] # 浅拷贝
-
- # roi与m进行与操作
- tmp = cv2.bitwise_and(roi, roi, mask=m) # roi与roi与操作之后还是roi,
- # 在于mask进行与运算,如果结果为True,返回原图,如果为False,返回黑色。
- cv2.imshow("tmp", tmp)
- # 进行add拼接
- dst = cv2.add(tmp, logo)
- cv2.imshow("dst",dst)
-
- # 在dog上还原
- dog[:300, :300] = dst
-
- cv2.imshow("logo", logo)
- cv2.imshow("dog", dog)
- cv2.waitKey(0)
- cv2.destroyAllWindows()