图像加法主要有两种用途:
Opencv的加运算就是两幅图像或一副图像和一个标量(标量即单一的数值)相加。
import cv2
out = cv2.add(src1, src2, dst=None, mask=None, dtype=None)
参数说明
返回值
dst(I) = saturate(src1(I) + src2(I)) if mask(I)≠0
即目标图像的每个像素,在mask对应位置的值不为0的情况下,该像素每个通道的值等于src1和src2同样位置像素通道的值相加(饱和)。
dst(I) = saturate(src1(I) + src2) if mask(I)≠0
即目标图像的每个像素,在mask对应位置的值不为0的情况下,该像素每个通道的值等于src1图像的每个像素的每个通道值与标量各值相加(数字化的常量会转成一个代表BGRA的四元组,首元素为该数字值,其他元素为0;如果是四元组则分别相加。下同)。
dst(I)=saturate(src1 + src2(I)) if mask(I)≠0
即目标图像的每个像素,在mask对应位置的值不为0的情况下,该像素每个通道的值等于src2图像的每个像素的每个通道值与标量相加。
关于后面两种场景,在OpenCV的文档中,标量还可以用一个与另一个参数对应图像数组的通道数相等元素个数的变量(例如针对场景3,opencv是这样描述的:“Sum of a scalar and an array when src1 is constructed from Scalar or has the same number of elements as src2.channels()”)。
import cv2
import numpy as npimg = cv2.imread(r'a.jpg')
img1 = img[0:3, 0:3]
print(img1)mask = np.zeros([3, 3], dtype=np.uint8)
d = cv2.add(img1, (1,1,1,1))
print(d)
输出如下
img1:
[[[240 240 240][240 240 240][241 241 241]][[241 241 241][241 241 241][241 241 241]][[241 241 241][241 241 241][241 241 241]]]d:
[[[241 241 241][241 241 241][242 242 242]][[242 242 242][242 242 242][242 242 242]][[242 242 242][242 242 242][242 242 242]]]
可能的解释:OpenCV可能强制对彩色图像处理是四通道的。
>>>import numpy as np
>>>import cv2
>>>img = cv2.add(1,2)
>>> img
array([[3.],[0.],[0.],[0.]])
>>> img.shape
(4, 1)
解释:
>>> imgBeauty = cv2.imread(r'a.jpg')
>>> img = imgBeauty[0:5, 0:5]
>>> img
array([[[230, 225, 224],[230, 225, 224],[230, 225, 224],[229, 224, 223],[227, 222, 221]],[[231, 226, 225],[230, 225, 224],[230, 225, 224],[230, 225, 224],[229, 224, 223]],[[231, 226, 225],[231, 226, 225],[231, 226, 225],[231, 226, 225],[230, 225, 224]],[[230, 225, 224],[231, 226, 225],[231, 226, 225],[231, 226, 225],[230, 225, 224]],[[231, 226, 225],[232, 227, 226],[231, 226, 225],[231, 226, 225],[230, 225, 224]]], dtype=uint8)
>>> mask = np.zeros([5, 5], dtype=np.uint8)
>>> mask[1]=[1,0,-1,1,0]
>>> mask[2] = [-2, -1, 0, 1, 2]
>>> mask
array([[ 0, 0, 0, 0, 0],[ 1, 0, 255, 1, 0],[254, 255, 0, 1, 2],[ 0, 0, 0, 0, 0],[ 0, 0, 0, 0, 0]], dtype=uint8)
>>> dest = np.zeros([5, 5, 3], dtype=np.uint8)
>>> img2 = cv2.add(img, img, mask=mask, dst=dest)
>>> img2
array([[[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0]],[[255, 255, 255],[ 0, 0, 0],[255, 255, 255],[255, 255, 255],[ 0, 0, 0]],[[255, 255, 255],[255, 255, 255],[ 0, 0, 0],[255, 255, 255],[255, 255, 255]],[[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0]],[[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0],[ 0, 0, 0]]], dtype=uint8)
>>> img2 is dest
True
从上面执行的案例可以看到:
对于上面介绍的加法场景中相同大小和通道数的两个图像数组相加处理,对于公式为:
dst(I)=saturate(src1(I)+src2(I))if mask(I)≠0
opencv文档中介绍上面函数可以使用矩阵表达式进行替换,替换的矩阵表达式如下:
dst = src1 + src2
结果发现:
第一张图像为:a.jpg
第二张图像为:b.jpg
import numpy as np
import cv2
img1 = cv2.imread(r'a.jpg')
img2 = cv2.imread(r'b.jpg')img1 = cv2.resize(img1, (300, 450))
img2 = cv2.resize(img2, (300, 450))print(img1.shape,img2.shape)
mask = np.zeros(img1.shape[0:2], dtype=np.uint8)
mask[0:100,0:100] = 1
imgNomask = cv2.add(img1, img2)
imgMask = cv2.add(img1, img2,mask=mask)
cv2.imwrite('imgNomask.jpg', imgNomask)
cv2.imwrite('imgMask.jpg', imgMask)
【1】https://blog.csdn.net/LaoYuanPython/article/details/109016144