【问题标题】:Convert RGB image to YUV and YCbCr color space image in Opencv Python在 Opencv Python 中将 RGB 图像转换为 YUV 和 YCbCr 颜色空间图像
【发布时间】:2018-06-15 22:39:52
【问题描述】:

谁能帮我使用 opencv Python 将 RGB 颜色空间图像转换为 YUV 颜色空间图像和 YCbCr 颜色空间图像?

【问题讨论】:

  • cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

标签: python opencv image-processing opencv-python image-preprocessing


【解决方案1】:

使用cv2.cvtColor(src, code)转换Color-Space,代码以COLOR_开头。

您可以使用它来查找颜色代码。

import cv2
## get all color codes
codes = [x for x in dir(cv2) if x.startswith("COLOR_")]

## print first three color codes
print(codes[:3])
# ['COLOR_BAYER_BG2BGR', 'COLOR_BAYER_BG2BGRA', 'COLOR_BAYER_BG2BGR_EA']

## print all color codes
print(codes)

如果您将图像读入BGR 空间,则使用cv2.COLOR_BGR2YUVcv2.COLOR_BGR2YCrCb

#cv2.COLOR_BGR2YUV
#cv2.COLOR_BGR2YCrCb

img = cv2.imread("test.png")
yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
cv2.imwrite("yuv.png", yuv)

如果您将图像读入RGB 空间,则使用cv2.COLOR_RGB2YUVcv2.COLOR_RGB2YCrCb


这是一个示例图像(在 BGR-HSV-YUV-YCRCB 颜色空间中):

【讨论】:

  • 请注意,cv2.COLOR_RGB2YCrCb 生成一个 3D 数组,而 cv2.COLOR_BGR2YUV_YV12 的 reslut 是一个具有相同高度 (im.shape[0] == h) 但额外宽度 (im.shape[1] == w*3/2) 的 2D 数组,并且 色度信息(UV)交错存储在那里。此外,YUV 和 YCrCb 的数值不同:对于前者,luminance 介于 16235 之间,正如 some video gamuts 所预期的那样, 而 YCrCb 是完整的 0..255 范围。
  • @AlexCohn 而不是 cv2.COLOR_BGR2YUV_YV12 是否有 YCrCb 420 格式的转换代码?我在文档中找不到它
  • @ShravyaBoggarapu 我不确定我是否理解您的问题。你的输入格式是什么,输出需要什么?
  • @AlexCohn,YUV 仅使用视频范围 (16-235),但 YCrCb 使用完整像素范围,对吗?但它始终以 444 格式存在(3 个分量为 1:1:1),但 420 格式使得色度分量的大小是亮度分量的四分之一。 OpenCV 提供了转换为 YUV420(视频范围)但不是全范围的方法——据我所知。我想知道你是否知道