“ image [:,:,1]”和“ cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)”之间有什么区别?

时间:2019-04-03 15:58:07

标签: python numpy opencv ocr

提供此图像:

Colored pencils

如果我们执行image[:, :, 1],则会看到:

Greyscale one

在做cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)时:

Greyscale two

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

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

实际上,[:, :, 1]到底能做什么?您能用我更好理解的几句话来解释吗?

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

2 个答案:

答案 0 :(得分:2)

[:, :, 1]是红色绿色蓝色的表示,因此它只是rgb(0, 0, 1)的另一种表达方式。 另一方面,cv2.cvtColor()也是颜色空间的变化,但是实际上,使用cv2.COLOR_BGR2GRAY作为参数,而是使用了灰度。

答案 1 :(得分:1)

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

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

现在,看着红色的铅笔,在红色通道中它将变成亮白色,因为其中有很多红色。看一下蓝色铅笔,蓝色通道中它会变成亮白色。看看绿色的铅笔,在绿色通道中它将变成亮白色。

如果您转换为灰度,则红色,绿色和蓝色通道会以一定百分比混合,而不是全部选择:

RGB

因此,如果您使用grey = 0.30*R + 0.59*G + 0.11*B ,则绿色将显示最亮(因为它们的权重较大),则红色将显示最暗的颜色。