OpenCV_python3_06

Practical Python and OpenCV,3rd Edition 06


按位运算(bitwise operations)

现在我们将检查四个按位运算:AND,OR,XOR和NOT。 这四个操作虽然非常基础和低级,但对图像处理至关重要。

新建一个bitwise.py

import numpy as np 
import cv2 

rectangle = np.zeros((300,300),dtype="uint8")
cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
cv2.imshow("Rectangle",rectangle)

circle = np.zeros((300,300),dtype="uint8")
cv2.circle(circle,(150,150),150,255,-1)
cv2.imshow("Circle",circle)
cv2.waitKey(0)

解释

我们将矩形图像初始化为0×300NumPy数组。然后在图像的中心绘制一个250×250的白色矩形(实心)。类似地,我们初始化另一个图像以包含我们的圆,再次以图像的中心为中心,半径为150像素。

显示效果:

bitwiseAnd = cv2.bitwise_and(rectangle,circle)
cv2.imshow("AND",bitwiseAnd)    
cv2.waitKey(0)

bitwiseOr = cv2.bitwise_or(rectangle,circle)
cv2.imshow("OR",bitwiseOr)
cv2.waitKey(0)

bitwiseXor = cv2.bitwise_xor(rectangle,circle)
cv2.imshow("XOR",bitwiseXor)
cv2.waitKey(0)

bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT",bitwiseNot)
cv2.waitKey(0)

如上所述,一个像素 is turned “on” 如果它有一个大于0的值,否则是”turned off”,如果它有一个0值。Bitwise函数在这些二进制条件下运行。

为了利用按位函数,我们假设(在大多数情况下)我们正在比较两个像素(唯一的例外是NOT函数)。我们将比较每个像素,然后构造我们的按位表示。

  1. AND:当且仅当两个像素都大于零时,按位AND为真
  2. OR:如果两个像素中的任何一个大于零,则按位OR为真。
  3. XOR:异或,取异,也就是两个不一样时才为真
  4. NOT:按位NOT反转图像中的“开”和“关”像素。

首先,我们使用cv2.bitwise_and函数对我们的矩形和圆形图像应用按位AND。如上面的列表所示,当且仅当两个像素都大于零时,按位AND才为真。 我们按位AND的输出可以如下图所示。我们可以看到正方形的边缘丢失了,因为我们的矩形不会覆盖像圆圈那样大的区域,因此两个像素都不会“打开”。

显示效果:

然后,我们使用按位OR,bitwise_or函数。 如果两个像素中的任何一个大于零,则按位OR为真。下图显示了按位OR的输出。在这种情况下,我们的正方形和矩形已合并在一起。

显示效果:

接下来是按位XOR函数,使用cv2.bitwise_xor函数。取两个图形不一样的地方为真。其余为假,就是0,黑色。

显示效果:

最后,我们使用cv2.bitwise_not函数应用NOT函数。实质上,按位NOT函数会翻转像素值。所有大于零的像素都设置为零,所有设置为零的像素都设置为255.下图为我们的白色圆圈翻转为黑色圆圈。

显示效果:

用到的函数

cv2.bitwise_and

cv2.bitwise_or

cv2.bitwise_xor

cv2.bitwise_not

更多的参考:

PPaO Chapter 6 – Image Processing


---------------- The End ----------------
支持一下
Fork me on GitHub ;