【Python+OpenCV之四】 ROI区域图像叠加&初级图像混合全剖析

'''
【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
参考作者:浅墨_毛星云

一、设定感兴趣区域——ROI(region of interest)
在图像处理领域,我们常常需要设置感兴趣区域(ROI,region of interest),来专注或者简化我们的工作过程 。
也就是从图像中选择的一个图像区域,这个区域是我们图像分析所关注的重点。我们圈定这个区域,以便进行进一步处理。
而且,使用ROI指定我们想读入的目标,可以减少处理时间,增加精度,给图像处理来带不小的便利。
'''
import cv2
import numpy as np

img3 = cv2.imread("3.jpg")
img4 = cv2.imread("4.jpg")
# img3 = cv2.resize(img1,(int(img1.shape[1]/5.0), int(img1.shape[0]/5.0)))  #原始图片太大,重新裁剪一下
# img4 = cv2.resize(img4,(int(img4.shape[1]/2.5), int(img4.shape[0]/2.5)))  #原始图片太大,重新裁剪一下
#cv2.imwrite("3.jpg", img3)
# cv2.imwrite("4.jpg", img4)

#现在是img4比较小,想讲img4加到img3上去

rows, cols, channels = img4.shape
rows3, cols3, channels3 = img3.shape
roi = img3[0:rows, 0:cols]
img4gray = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)
ret,mask=cv2.threshold(img4gray,175,255,cv2.THRESH_BINARY)
# cv2.imshow("mask:", mask)
mask_inv = cv2.bitwise_not(mask) #把img4的区域取反,按位运算
# cv2.imshow("mask_inv:", mask_inv)
img3_bg =  cv2.bitwise_and(roi, roi, mask=mask)   #抠图区进行掩模保护,留下抠图图片
cv2.imshow("img3_bg:", img3_bg)
img4_fg = cv2.bitwise_and(img4,img4,mask=mask_inv)
cv2.imshow("img4_fg:", img4_fg)
dst = cv2.add(img3_bg,img4_fg)
img3[rows3-rows-30:rows3-30, cols3-cols-30:cols3-30] =dst
cv2.imshow("dst in img3:", img3)


'''
二、初级图像混合——线性混合操作
我们通过在范围0到1之间改变alpha值,来对两幅图像或两段视频产生时间上的画面叠化(cross-dissolve)效果,就像幻灯片放映和电影制作中的那样。
即在幻灯片翻页时设置的前后页缓慢过渡叠加效果,以及电影情节过渡时经常出现的画面叠加效果。
'''
img5 = cv2.imread("1.jpg")
h,w,_ = img3.shape
imgnew = cv2.resize(img4, (w,h), interpolation=cv2.INTER_AREA)  #两张图片需是大小相同的
alpha = 0.5  #将两张图片叠加在一起第一张图片的权重
beta = 1 - alpha  #第二张图片的权重
gamma = 0  #一个加到权重总和上的标量值,dst = src1*alpha+ src2*beta + gamma;
img_add = cv2.addWeighted(img3, alpha, imgnew, beta, gamma)
# cv2.imshow("img_add:", img_add)

cv2.waitKey()
cv2.destroyAllWindows()

'''
cv2.add()是将两张图片叠加在一起的,会挡住下面图片的某一部分的
cv2.addWeighted是将两张图片进行融合
'''

add操作的结果如下:

【Python+OpenCV之四】 ROI区域图像叠加&初级图像混合全剖析

add_weighted结果:

【Python+OpenCV之四】 ROI区域图像叠加&初级图像混合全剖析