"image[:, :, 1]" 和 "cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)" 有什么区别?

What's the difference between "image[:, :, 1]" and "cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)"?

提供这张图片:

如果我们这样做 image[:, :, 1],我们会看到:

同时进行 cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):

它们略有不同,但只是略有不同。

使用数组访问 [:, :, 1] 而不是 cv2.cvtColor() 调用有什么具体原因吗?

实际上,[:, :, 1] 到底是做什么的?能简单解释一下吗?

我的最终目的是从一些图像中提取文本。我应该坚持两种解释的方法中的一些吗?还是应该完全一样?

[:, :, 1]是红绿蓝的表示,所以只是rgb(0, 0, 1)的另一种说法。 另一方面,cv2.cvtColor() 也是颜色空间的变化,但是使用 cv2.COLOR_BGR2GRAY 作为参数,您实际上使用的是灰度。

如果您使用 OpenCV 加载图像,image[:,:,0] 将是蓝色通道,image[:,:,1] 将是绿色通道,image[:,:,2]将是红色通道。我是说 OpenCV 使用 BGR 排序。

如果您使用 PIL/Pillow 或几乎任何其他模块打开图像,image[:,:,0] 将是红色通道,image[:,:,1] 将是绿色通道和 image[:,:,2] 将是蓝色通道。我是说世界其他地方使用 RGB 排序。

现在,看看红色铅笔,它在红色通道中是亮白色的,因为里面有很多红色。看蓝色铅笔,它在蓝色通道中是亮白色的。看绿色铅笔,在绿色通道里会是亮白色

如果您转换为灰度,红色、绿色和蓝色通道会按特定百分比混合,而不是全部单独选择:

grey = 0.30*R + 0.59*G + 0.11*B

因此,如果您使用 cvtColor(...,BGR2GRAY),绿色将显示为最亮(因为它们具有更大的权重),然后是红色,而蓝色将是最暗的。