【opencv系列08】OpenCV4.X图像融合操作

点击上方“AI搞事情”关注我们


图像叠加

add(src1, src2, dst=None, mask=None, dtype=None)函数或者numpy操作实现图像按位相加,若两个图像相加,图像必须有相同的通道数和类型;若一个元素为标量,则图像像素均加上这个标量值。

NOTE:

  • OpenCV添加是饱和操作,也就是有上限值,而Numpy添加是模运算。

  • 添加两个图像时,OpenCV功能将提供更好的结果,所以建议使用OpenCV进行图像加操作。

import cv2
import numpy as np
                                                   
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

输出

[[255]]
[4]

 

图像融合

addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)同样属于图像加法操作,但是对图像像素赋予不同的权重(0到1之间),使得它具有混合感或透明感。

import cv2
import numpy as np

img1 = cv2.imread('image.jpg')
img2 = cv2.imread('image2.jpg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0])) # 统一图片大小

dst = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
cv2.imshow('merge', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果


按位操作

包括按位AND,OR,NOT和XOR运算。

应用:希望将opencv logo放在图像上方,如果叠加两个图像,它将改变颜色;如果融合两个图像,会得到一个透明的效果又不希望其透明,如果它是一个矩形区域,我可以使用ROI按之前描述的像素替换操作,但是opencv徽标并不是矩形,可以通过按位操作完成相关功能。

import cv2
import numpy as np
                                                                                                       
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('opencv-logo.jpg')
                                                                                                       
img2 = cv2.resize(img2, (100, 100))
# 将logo放在图像左上角,创建一个logo大小的ROI区域
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
                                                                                                       
# 创建一个logo的掩码和其逆掩码
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
                                                                                                       
cv2.imshow('gray', img2gray)
cv2.imshow('bin', mask)
# 背景ROI
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
                                                                                                       
# 前景img2
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
                                                                                                       
# 图像叠加操作
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
                                                                                                       
cv2.imshow('res', img1)
cv2.waitKey(0)

结果

往期推荐

长按二维码关注我们

有趣的灵魂在等你

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值