学习图片见的数学运算,图像混合
最终达到的效果如下:
一、图片相加(改变图像的颜色)
对于两张图片的叠加,我们这里可以使用cv2.add()
函数,但要保证两证图片的高、宽、通道数相同。
值得一提的是,numpy可以直接用 + 链接,但是这两种方法达到的效果可能不同:
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x, y)) # 250+10 = 260 => 255
print(x + y) # 250+10 = 260 % 256 = 4
如果我们进行处理的图像是二值化图像,那么通过numpy的 + 方式将更加简便
图像二值化:图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
cv2.add()
:
cv2.add将两个图片进行加和,大于255的使用255计数
eg:
import cv2
import numpy as np
img0 = cv2.imread('0.png')#飞机
img1 = cv2.imread('1.png')#汽车
res = cv2.add(img0,img1)
cv2.imshow('img',res)
cv2.waitKey(0)
二、图像混合(改变了图像透明度)
使用cv2.addWeighted()
,他也是两个图片想家的操作,只不过进行了权重相加
d s t = α ∗ i m g 1 + β ∗ i m g 2 + γ dst = \alpha * img1 + \beta * img2 +\gamma dst=α∗img1+β∗img2+γ
其中 γ \gamma γ 相当于一个修正的值
res2 = cv2.addWeighted(img0,0.8,img1,0.2,0)
#将小飞机的权重设置为0.8,小汽车的权重设为0.2相加
cv2.imshow('img2',res2)
cv2.waitKey(0)
三、按位操作
按位操作,顾名思义是按位 与、或、非、异或 (and,、or、 not、 xor)的操作
对应的函数为:cv2.bitwise_and()
, cv2.bitwise_not()
, cv2.bitwise_or()
, cv2.bitwise_xor()
具体的用途如下:
ps:在这之前,说明一下掩膜(mask)的概念:用一张二值化的图片对另一张图片进行局部遮挡
img1 = cv2.imread('0.jpg')
img2 = cv2.imread('0.png')
#由于飞机图像太大这里进行缩放操作
img2 = cv2.resize(img2,None,fx = 0.3,fy = 0.3)
# 把飞机放在左上角,所以选取这一块区域
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]
#创建掩膜
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
# 通过反转上面的图像创建掩码(因为不希望背景影响叠加)
mask_inv = cv2.bitwise_not(mask)#将飞机进行按位取反
# 保留除飞机外的背景
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)#在img1上面,将飞机和mask取 与 使值为0
#模板的作用就是选择原图中的那个像素可以拷贝
dst = cv2.add(img1_bg, img2) # 进行融合
img1[:rows, :cols] = dst # 融合后放在原图上
cv2.imshow('result', img1)
cv2.waitKey(0)
关于mask参数:
模板的作用就是选择原图中的那个像素可以拷贝
在位置(x,y)时,如果mask的像素值不等于0,则dst(x,y) = src(x,y);
如果mask的像素值等于0,则dst(x,y) = 0;