【问题标题】:What's the difference between "image[:, :, 1]" and "cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)"?“image[:, :, 1]”和“cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)”有什么区别?
【发布时间】:2019-08-25 05:39:53
【问题描述】:

给出这张图片:

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

一边做cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):

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

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

实际上,[:, :, 1] 究竟做了什么?你能用几句话解释一下吗?

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

【问题讨论】:

  • [:, :, 1] 是绿色通道,而cv2.cvtColor() call one 是灰度图像。这是两个不同的东西。
  • 要查看差异,您可以快速查看:a = np.zeros((400,400,3),dtype=np.uint8); a[...,1] = 255; cv2.imwrite('green.png',a); cv2.imwrite('gray.png',cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)),然后查看这两张图片。
  • 感谢@Divakar 的这篇文章,简单但很有帮助!

标签: python numpy opencv ocr


【解决方案1】:

[:, :, 1] 是 Red Green Blue 的代表,所以它只是 rgb(0, 0, 1) 的另一种说法。 而cv2.cvtColor() 也是色彩空间的变化,但以cv2.COLOR_BGR2GRAY 为参数,实际上你使用的是灰度。

【讨论】:

  • 感谢@Tjofoed!对不起,我对此一无所知,但是,为什么我看不到 image[:, :, 1] 有点绿色的输出?事实上,用三个通道进行测试,我总是看到相同的灰色输出。我做错了什么吗?对源图像有限制吗?
  • @Afialapis 它不应该是“绿色图像”。它应该向您显示绿色通道的强度。
  • 不用道歉!您可以将 rgb 设置为 0-255,通过将其设置为 1,您只能获得所选颜色的 1/255,其中 0 为黑色,255 为红色/绿色/蓝色。根据您的视力,您必须输入更高的数字才能看到实际颜色。希望这是有道理的!
【解决方案2】:

如果您使用 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),绿色会显得最亮(因为它们的权重更大),然后红色和蓝色会最暗。

【讨论】:

  • 很好的答案@Mark Setchell。谢谢!
猜你喜欢
  • 2020-01-21
  • 2021-12-20
  • 2021-06-25
  • 2019-09-10
  • 1970-01-01
  • 2017-08-31
  • 2011-01-06
  • 1970-01-01
  • 2021-02-18
相关资源
最近更新 更多