我正在 python 中试验 OpenCV 库。假设我读到一张图片,例如:
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('imgs/watermark_no_copy.jpg')
这个 watermark_no_copy 图像应该是一些 python 库的一部分。我现在要做的是仅提取图像中不是白色的部分。我遇到了以下代码来完成这项工作:
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
mask_inv = cv2.bitwise_not(img_gray)
img_extracted = cv2.bitwise_and(img, img, mask=mask_inv)
我不完全明白发生了什么。我知道我们首先将图像转换为灰度。灰度图像仅由一个颜色通道(仅具有不同强度的黑白)组成。在我的例子中,图像的背景是白色的,因此应该分配强度 255。然而,图像的彩色部分是红色的。它不会被分配强度 0。
现在,bitwise_not 是如何工作的?我知道这应该将任何位 1 翻转为 0,并将任何位 0 翻转为 1。但是,在那个灰度图像中,我们不只有 0 和 1。我们有不同的强度值。究竟如何,这行得通吗?同样的问题可以应用于最后一行的 bitwise_and。图像本身的 bitwise_and 应该只返回该图像,不是吗?