rgb到Y U V转换和访问Y、U和V通道

2024-06-12 12:59:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经找了一段时间这个转换。在Linux上使用Python将RGB图像转换成Y U V图像并访问Y、U和V通道的方法是什么?(使用opencv、skipage等)

更新: 我用的是opencv

img_yuv = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
y, u, v = cv2.split(img_yuv)

cv2.imshow('y', y)
cv2.imshow('u', u)
cv2.imshow('v', v)
cv2.waitKey(0)

得到了这个结果,但看起来都是灰色的。无法获得类似于wikipedia page的结果

我做错什么了吗?

enter image description here


Tags: 方法图像imageimglinuxrgbcv2opencv
1条回答
网友
1楼 · 发布于 2024-06-12 12:59:27

NB:3.2.0之前的OpenCV版本中的YUV<;->;RGB转换是buggy!首先,在许多情况下,U和V通道的顺序被交换。据我所知,从2.4.13.2版本开始,2.x仍处于崩溃状态。


它们出现灰度的原因是,在splitt三通道YUV图像中,您创建了三个一通道图像。由于包含像素的数据结构不存储有关值所表示的的任何信息,imshow将任何单通道图像视为灰度显示。类似地,它会将任何3通道图像视为BGR。

你在Wikipedia example中看到的是色度通道的假彩色渲染。为了实现这一点,您需要apply a pre-defined colormap或使用自定义的look-up table (LUT)。这会将U和V值映射到相应的BGR值,然后可以显示这些值。

事实证明,维基百科示例中使用的彩色地图相当简单。

U通道的颜色映射

绿色和蓝色之间的简单进展:

colormap_u = np.array([[[i,255-i,0] for i in range(256)]],dtype=np.uint8)

Colormap for U channel

V通道的颜色映射

绿色和红色之间的简单级数:

colormap_v = np.array([[[0,255-i,i] for i in range(256)]],dtype=np.uint8)

Colormap for V channel

把你想象成一个例子

现在,我们可以把它们放在一起,重新创建一个示例:

import cv2
import numpy as np


def make_lut_u():
    return np.array([[[i,255-i,0] for i in range(256)]],dtype=np.uint8)

def make_lut_v():
    return np.array([[[0,255-i,i] for i in range(256)]],dtype=np.uint8)


img = cv2.imread('shed.png')

img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
y, u, v = cv2.split(img_yuv)

lut_u, lut_v = make_lut_u(), make_lut_v()

# Convert back to BGR so we can apply the LUT and stack the images
y = cv2.cvtColor(y, cv2.COLOR_GRAY2BGR)
u = cv2.cvtColor(u, cv2.COLOR_GRAY2BGR)
v = cv2.cvtColor(v, cv2.COLOR_GRAY2BGR)

u_mapped = cv2.LUT(u, lut_u)
v_mapped = cv2.LUT(v, lut_v)

result = np.vstack([img, y, u_mapped, v_mapped])

cv2.imwrite('shed_combo.png', result)

结果:

Composite of original and Y, U, V channels

相关问题 更多 >