rgb到yuv转换并访问Y,U和V通道

ent*_*ton 4 python opencv image image-processing scikit-image

我一直在寻找这种转换.有什么方法可以在Linux上使用Python将RGB图像转换为YUV图像并访问Y,U和V通道?(使用opencv,skimage等等...)

更新:我使用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)
Run Code Online (Sandbox Code Playgroud)

并得到了这个结果,但他们似乎都是灰色的.无法在维基百科页面上显示结果

难道我做错了什么?

在此输入图像描述

Dan*_*šek 8

注意:3.2.0之前的OpenCV版本中的YUV < - > RGB转换是错误的!例如,在许多情况下,U和V通道的顺序被交换.据我所知,从2.4.13.2版本开始,2.x仍然被打破.


它们出现灰度的原因是,在split3通道YUV图像中,您创建了三个1通道图像.由于包含的像素的数据结构不任何信息存储关于什么的值代表,imshow把任何1通道图像为灰度显示.同样,它会将任何3通道图像视为BGR.

您在维基百科示例中看到的是色度通道的伪彩色渲染.为了实现这一点,您需要应用预定义的色彩映射或使用自定义查找表(LUT).这会将U和V值映射到适当的BGR值,然后可以显示这些值.

事实证明,用于维基百科示例的色彩映射非常简单.

U通道的Colormap

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

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

U通道的Colormap

V通道的Colormap

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

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

V通道的Colormap

可视化YUV就像示例一样

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

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)
Run Code Online (Sandbox Code Playgroud)

结果:

原始和Y,U,V通道的复合