原文鏈接:http://www.juzicode.com/archives/6052
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取模。