OpenCV-Python教程:图像的乘法运算(multiply)

原文链接:http://www.juzicode.com/archives/6052

返回Opencv-Python教程

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取模。

扩展阅读:

  1. OpenCV-Python教程
  2.  

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注