1 图像的加法运算
OpenCV函数cv.add() 或仅通过numpy操作res = img1 + img2 添加两个图像。
两个 图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值 注意 OpenCV加法和Numpy加法之间有区别。
OpenCV加法是饱和运算,而Numpy加法是模运 算。
1.1 图像相加 add()
2个图像对象img,img2如果通道数一样、大小一样,可以使用cv2.add(img,img2)相加,得到一个新的图像。
import cv2
import numpy as np
from PIL import Image
img1 = cv2.imread('./images/lena.jpg')
img2 = cv2.imread('./images/opencv_logo.png')
dst = img1+img2
img1 = cv2.imread('./images/lena.jpg')[:512,:512]
img2 = cv2.imread('./images/opencv_logo.png')[:512,:512]
#dst = img1+img2
dst = cv2.add(img2,img1)
img_rgb = dst[:, :, ::-1]
Image.fromarray(img_rgb)
img1 = cv2.imread('./images/yifei.jpg')[:267,:189]
img2 = cv2.imread('./images/opencv_logo.png')[:267,:189]
#dst = img1+img2
dst = cv2.add(img2,img1)
img_rgb = dst[:, :, ::-1]
Image.fromarray(img_rgb)
2个图像中白色部分会覆盖了原来的位置,那是因为add()方法相加的图像如果超过了阈值会被截断。 在OpenCV中图像的算术运算遵循“饱和运算”的规则,如果计算的结果超过了阈值范围,则就近进行截断,比如unit8类型的数据范围是【0,255】,如果2个数值 直接相加的结果大于255就会赋值为255。
1.2 图像相加 运算符+
img1 = cv2.imread('./images/lena.jpg')[:512,:512]
img2 = cv2.imread('./images/opencv_logo.png')[:512,:512]
dst = img1+img2
img_rgb = dst[:, :, ::-1]
Image.fromarray(img_rgb)
从运行结果看,+运算符将2个图像相加,新图像和lena.jpg差异不大,但是和opencv-logo.png相差甚远。 从像素[111,222]的运算结果看,当2个值相加大于255时,会将这个值对256求余得到新的像素值。
1.3 加权加法 addWeighted()
addWighted()可以用来实现2幅图像的不同权值的加法,实现图像混合的效果。
函数cv2.addWeighted()可以按下面的公式对图片进行混合操作。
$g(x)=(1-a)f_0(x)+af_1(x)+b$
现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重是0.3, b=0。
img2_dst = cv2.resize(img2,(img1.shape[0],img1.shape[1])) #放大图像
dst = cv2.addWeighted(img1, 0.7, img2_dst, 0.3, 0) # 第一幅图的权重是 0.7 第二幅图的权重是 0.3
img_rgb = dst[:, :, ::-1]
Image.fromarray(img_rgb)