OpenCV-Python图像混合

学习图片见的数学运算,图像混合
最终达到的效果如下:
在这里插入图片描述
一、图片相加(改变图像的颜色)
对于两张图片的叠加,我们这里可以使用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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值