Python OpenCV图像带蒙版合并
最近遇到的场景,有两张图片(cv2的BGR格式)和一个蒙版(只有0,1两种值),需要按照蒙版的值将两张图象合并。
一开始百度咕果上到处查,最接近的大概是bitwise_and
函数,但是其起作用的主要是0这个像素值,显然只能实现抠图的功能,但是不能合并。可以看看介个。
不废话,看代码:
import numpy as np
def mergeImgs(img1, img2, mask):
'''
Replacing places in img1 with img2 where mask = 1.
'''
img2 = img2 * mask[:,:,np.newaxis]
mask = mask * (-1) + 1
mask = mask.astype('uint8')
img1 = img1 * mask[:,:,np.newaxis]
img1 = img1 + img2
return img1
原理是使用矩阵的乘法运算,把两张图片相反区域的、mask
中值为0的区域,像素颜色设置为0,然后再把两张图矩阵相加。由于mask区域是直接用的取反处理,所以不会出现任意一个错误像素点(完美拼图)。
想着想着发现这个+
和*
操作分别对应了OpenCV里的bitwise_and
和bitwise_or
操作,估计最多就是效率上的差别吧= =
总而言之,OpenCV并没有提供一个一步到位的多图区域拼接函数,但是只要思路对了,自己几行代码也能搞定。