如何在Python中实现RGB图像转YUV420 planar格式?求相关指引
Python实现RGB到YUV420 Planar格式转换
方法一:用OpenCV快速实现(推荐)
OpenCV内置了RGB到YUV格式的转换接口,能快速得到YUV420 planar数据:
import cv2 import numpy as np def rgb_to_yuv420_planar(rgb_image): # 将RGB转换为I420格式的YUV(半平面结构) yuv_i420 = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2YUV_I420) h, w = rgb_image.shape[:2] # 拆分出Y、降采样后的U和V分量 y = yuv_i420[:h, :w] u = yuv_i420[h:h+h//2:2, ::2] v = yuv_i420[h+h//2::2, ::2] # 合并为planar格式:Y连续存储 → U连续存储 → V连续存储 return np.concatenate([y.flatten(), u.flatten(), v.flatten()]) # 使用示例 # 注意:OpenCV默认读取图像为BGR格式,需先转成RGB bgr_img = cv2.imread("your_image.jpg") rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) yuv420_planar_data = rgb_to_yuv420_planar(rgb_img)
方法二:手动实现(理解原理)
基于BT.601标准的转换公式手动计算,适合想搞清楚底层逻辑的场景:
import numpy as np def rgb_to_yuv420_planar_manual(rgb_image): r, g, b = rgb_image[:, :, 0], rgb_image[:, :, 1], rgb_image[:, :, 2] h, w = rgb_image.shape[:2] # 计算Y分量(范围0-255) y = 0.299 * r + 0.587 * g + 0.114 * b y = y.astype(np.uint8) # 计算U分量并做2x2降采样(加128偏移使范围回到0-255) u = (-0.14713 * r - 0.28886 * g + 0.436 * b) + 128 u = u.astype(np.uint8) # 对U分量降采样:取每个2x2块的平均值 u_down = np.zeros((h//2, w//2), dtype=np.uint8) for i in range(h//2): for j in range(w//2): u_down[i,j] = np.mean(u[2*i:2*i+2, 2*j:2*j+2]) # 计算V分量并做2x2降采样 v = (0.615 * r - 0.51499 * g - 0.10001 * b) + 128 v = v.astype(np.uint8) v_down = np.zeros((h//2, w//2), dtype=np.uint8) for i in range(h//2): for j in range(w//2): v_down[i,j] = np.mean(v[2*i:2*i+2, 2*j:2*j+2]) # 合并为planar格式 return np.concatenate([y.flatten(), u_down.flatten(), v_down.flatten()]) # 使用示例 rgb_img = cv2.cvtColor(cv2.imread("your_image.jpg"), cv2.COLOR_BGR2RGB) yuv420_planar_data = rgb_to_yuv420_planar_manual(rgb_img)
注意事项
YUV420 planar的存储总大小为 宽×高×1.5 字节,其中Y占 宽×高 字节,U和V各占 (宽×高)/4 字节。
内容的提问来源于stack exchange,提问作者mash
相关产品推荐
相关产品推荐

