python - rgb 到 yuv 转换和访问 Y、U 和 V channel

标签 python image opencv image-processing scikit-image

我一直在寻找这种转换。在Linux上使用Python将RGB图像转换成YUV图像并访问Y、U、V channel 有哪些方式? (使用 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)

得到了这个结果,但它们看起来都是灰色的。无法获得在 wikipedia page 上表示的结果

我做错了什么吗?

enter image description here

最佳答案

NB:在 3.2.0 之前的 OpenCV 版本中,YUV <-> RGB 转换是 buggy !其一,在许多情况下,U channel 和 V channel 的顺序被调换了。据我所知,截至 2.4.13.2 版本,2.x 仍然存在问题。


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

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

事实证明,用于维基百科示例的颜色图相当简单。

U channel 的颜色图

绿色和蓝色之间的简单渐变:

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

Colormap for U channel

V channel 的颜色图

绿色和红色之间的简单渐变:

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

Colormap for V channel

像示例一样可视化 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)

结果:

Composite of original and Y, U, V channels

关于python - rgb 到 yuv 转换和访问 Y、U 和 V channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43983265/

相关文章:

python - 当使用 __all__ 在父模块中公开时,如何防止用户从子模块导入 x

python - PIL仅保存第一张图像

javascript - HTML 5 Canvas - 在 Canvas 中动态包含多个图像

html - 图像在 div 元素边界之外不可见

python - opencv python中的运动跟踪

python - 将索引和字符串连接到新列

python - 我如何访问YouTube第一搜索结果?

python - 将多张图像连接成一张

python - 通过将背景设为白色来从背景中提取前景

.net - Windows 窗体应用程序 vc++ 上的 opencv 鼠标处理