原文链接:http://www.juzicode.com/opencv-python-multiply
1、图像乘法multiply()
multiply()用法:
dst=cv2.multiply(src1, src2[, dst[, scale[, dtype]]]),src1和src2为图像对象,可选参数scale为放大倍数。结果dst=saturate(scale*src1*src2)
multiply()遵循饱和运算规则,比如uint8类型的数据如果超过255会被截断到255。下面的例子读入lena.jpg和opencv-logo.png后进行相乘:
import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = cv2.imread('..\\lena.jpg')[0:512,0:512] #截取部分,保证大小一致
img2 = cv2.imread('..\\opencv-logo.png' )[0:512,0:512]
print('multiply(img,img2):')
img_ret = cv2.multiply(img,img2)
print('img[161,199]:',img[161,199])
print('img2[161,199]:',img2[161,199])
print('img_ret[161,199]:',img_ret[161,199])
print('img[100,200]:',img[100,200])
print('img2[100,200]:',img2[100,200])
print('img_ret[100,200]:',img_ret[100,200])
cv2.imshow('multiply(img,img2)',img_ret)
cv2.waitKey(0)
运行结果:
VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.2
multiply(img,img2):
img[161,199]: [109 105 201]
img2[161,199]: [ 0 0 255]
img_ret[161,199]: [ 0 0 255]
img[100,200]: [118 119 209]
img2[100,200]: [ 0 0 255]
img_ret[100,200]: [ 0 0 255]
从图像学意义上看,因为opencv-logo.png的每个像素要么是0要么是255,用multiply()计算它和其他的图像相乘得到的结果也是0或者255,所以最后的图像和opencv-logo.png一样。
2、符号乘法*
符号乘法实际就是numpy数组的乘法,和用+/-做numpy加减法一样,在数值类型表示范围的上限加1取模,比如uint8类型的数据对256取模。
import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = cv2.imread('..\\lena.jpg')[0:512,0:512] #截取部分,保证大小一致
img2 = cv2.imread('..\\opencv-logo.png' )[0:512,0:512]
print('img*img2:')
img_ret = img*img2
print('img[161,199]:',img[161,199])
print('img2[161,199]:',img2[161,199])
print('img_ret[161,199]:',img_ret[161,199])
print('img[100,200]:',img[100,200])
print('img2[100,200]:',img2[100,200])
print('img_ret[100,200]:',img_ret[100,200])
cv2.imshow('img*img2',img_ret)
cv2.waitKey(0)
运行结果:
VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.2
img*img2:
img[161,199]: [109 105 201]
img2[161,199]: [ 0 0 255]
img_ret[161,199]: [ 0 0 55]
img[100,200]: [118 119 209]
img2[100,200]: [ 0 0 255]
img_ret[100,200]: [ 0 0 47]
小结:图像的乘法运算multiply()和加减法运算add()、subtract()一样也遵守“饱和运算”规则,最终的计算结果在特定的数据类型表示范围内截断。符号乘法实际就是numpy数组的乘法,在表示范围的上限加1取模。