1、按位取反bitwise_not()
按位取反就是将数值根据每个bit位1变0,0变1,比如0xf0按位取反就变成了0x0f,如果是uint8类型的数据,取反前后的数据相加结果为0xff(255)。下面的例子将lena.jpg和opencv-logo.png分别按位取反:
import cv2 print('cv2.__version__:',cv<p>本文来源gao!%daima.com搞$代*!码$网9</p>2.__version__) img1 = cv2.imread('..\\lena.jpg') img2 = cv2.imread('..\\opencv-logo.png' ) img_ret1 = cv2.bitwise_not(img1) print('img1[161,199]: ',img1[161,199]) print('img_ret1[161,199]:',img_ret1[161,199]) cv2.imshow('lena-not-juzicode',img_ret1) img_ret2 = cv2.bitwise_not(img2) print('img2[100,200]: ',img2[100,200]) print('img_ret2[100,200]:',img_ret2[100,200]) cv2.imshow('logo-not-juzicode',img_ret2) cv2.waitKey(0)
运行结果:
cv2.__version__: 4.5.2
img1[161,199]: [109 105 201]
img_ret1[161,199]: [146 150 54]
img2[100,200]: [ 0 0 255]
img_ret2[100,200]: [255 255 0]
比如lena.jpg的像素点[161,199] B通道的值为109(0110 1101),取反后的值为146(1001 0010),转换为二进制后观察到每个bit为如果为0就变成1、如果为1就变成0:
上图中左侧lena这种图像是不是有种似曾相识的感觉?能回忆起来是啥子东西的朋友就要暴露年龄了,二十年前流行的胶片相机,洗出来的底片就是这个样子的。
取反还有很多应用的地方,比如做OCR文字识别的时候,因为一般的书籍是白纸黑字,背景是白色,而要分析识别的字却是黑色,在做完二值化之后要识别的字是黑色的,如果直接做图像切割,分离出来的就是背景“白纸”而不是目标对象“黑字”了,而做完取反处理后就能达到切割目标白色文字的效果。下图是”白纸黑字“取反前后的对比:
bitwise_not()的入参中只有1个图像实例作为输入,而接下来介绍的与、或、异或等其他几种逻辑运算则需要2个图像实例(numpy数组)或者1个图像实例和1个标量数据。和图像的加减乘除运算一样,当涉及到2个图像实例时,也要求图像的行列数一致。
2、按位与bitwise_and()、或bitwise_or()、异或bitwise_xor()
按位与、或、异或操作需要2个图像对象、或者1个图像对象和1个标量数据相互作用,接口形式如下:
dst = cv2.bitwise_or(src1, src2[, dst[, mask]] )
dst = cv2.bitwise_or(src1, src2[, dst[, mask]] )
dst = cv2.bitwise_or(src1, src2[, dst[, mask]] )
下面是2个图像按位与、或、异或的例子:
import cv2 print('cv2.__version__:',cv2.__version__) img1 = cv2.imread('..\\lena.jpg' )[0:300,0:300] img2 = cv2.imread('..\\messi5.jpg' )[0:300,0:300] img_ret1 = cv2.bitwise_and(img1,img2) print('img1[161,199]: ',img1[161,199]) print('img2[161,199]: ',img2[161,199]) print('img_ret1[161,199]:',img_ret1[161,199]) cv2.imshow('and-juzicode',img_ret1) img_ret2 = cv2.bitwise_or(img1,img2) print('img_ret2[161,199]:',img_ret2[161,199]) cv2.imshow('or-juzicode',img_ret2) img_ret3 = cv2.bitwise_xor(img1,img2) print('img_ret3[161,199]:',img_ret3[161,199]) cv2.imshow('xor-juzicode',img_ret3) cv2.waitKey(0)