OpenCV中的四种逻辑运算:
与运算:
cv2.bitwise_and(src1, src2[, dst[, mask]]);
或运算:
cv2.bitwise_or(src1, src2[, dst[, mask]]);
非运算:
cv2.bitwise_not(src1, src2[, dst[, mask]]);
异或运算:
cv2.bitwise_xor(src1, src2[, dst[, mask]]);
Mask
@param mask optional operation mask, 8-bit single channel array, that . specifies elements of the output array to be changed.
mask称掩码/掩模,处理图片时需创建一张与原图一致的黑白图,对图像感兴趣区域进行处理。 使用 src1 和 src2 执行了对应的逻辑运算之后,再与mask做与运算。
如果结果是True,取原图的值,如果是False,值就统一是0
import cv2
import numpy as np
# introduce picture
img = cv2.imread("./xxx.jpeg")
# design logo
logo = np.zeros((200,200,3),np.uint8)
logo[20:120,20:120] = [255,192,18]
logo[80:180,80:180] = 255
# cv2.imshow("logo",logo)
# add mask
# mask = np.zeros((200,200,3),np.uint8) #错误写法 不应该使用3通道
mask = np.zeros((200,200),np.uint8)
mask[20:120,20:120] = 255
mask[80:180,80:180] = 255
#cv2.imshow("mask",mask)
# setting logo locationg in img
roi = dog[:200,:200]
#cv2.imshow("roi",roi)
m = cv2.bitwise_not(mask)
tmp = cv2.bitwise_and(roi,roi,mask=m)
#cv2.imshow("tmp",tmp)
dst = cv2.add(tmp,logo)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# add mask
mask = np.zeros((200,200),np.uint8)
创建掩码时,这里不能写成np.zeros((200,200,3),np.uint8),否则会报以下错误。
原因是mask必须为单通道。
error Traceback (most recent cll last) <ipython-input-18-6785031a9767> in <module>() 28 m = cv2.bitwise_not(mask) 29 ---> 30 tmp = cv2.bitwise_and(roi,roi,mask=m) 31 cv2.imshow("tmp",tmp) 32 error: OpenCV(4.5.3) /private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-req-build-ucsrqn3m/opencv/modules/core/src/arithm.cpp:230: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'binary_op'