Python中RGB图像转YUV444格式方法咨询及YCbCr相关疑问
在Python中实现RGB到YUV444的转换及YCbCr与YUV的区别
你观察得没错:OpenCV和PIL/Pillow中提供的“YUV”相关转换,实际上都是YCbCr格式——YCbCr是YUV色彩空间的数字化实现版本,广泛应用于数字图像与视频领域。而YUV444指的是采样格式,即Y、U、V三个分量的分辨率完全一致(每个像素都对应完整的Y、U、V值,无下采样),因此我们可以基于YCbCr的转换逻辑,直接得到YUV444格式的输出。
以下是几种可行的实现方法:
方法1:使用OpenCV实现
OpenCV的cv2.cvtColor函数支持COLOR_RGB2YCrCb转换,输出的结果就是4:4:4采样的YCbCr(即YUV444),因为OpenCV默认不会对分量进行下采样。
import cv2 import numpy as np # 读取图像并转为RGB格式(OpenCV默认读入为BGR) img_bgr = cv2.imread('input.jpg') img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 转换为YCbCr(YUV444) img_yuv444 = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2YCrCb) # 拆分Y、Cr、Cb分量(Cr对应U,Cb对应V,部分标准顺序可能有差异) Y, Cr, Cb = cv2.split(img_yuv444) # 合并分量回YUV444格式(可选) merged_yuv = cv2.merge([Y, Cr, Cb])
方法2:使用PIL/Pillow实现
Pillow的Image.convert('YCbCr')方法同样会输出4:4:4采样的图像,每个像素包含完整的Y、Cb、Cr分量,符合YUV444的定义。
from PIL import Image # 读取并转为RGB图像 img_rgb = Image.open('input.jpg').convert('RGB') # 转换为YCbCr(YUV444) img_yuv444 = img_rgb.convert('YCbCr') # 拆分分量 Y, Cb, Cr = img_yuv444.split() # 合并分量(可选) merged_yuv = Image.merge('YCbCr', (Y, Cb, Cr))
方法3:手动计算(基于标准公式)
如果需要完全自定义转换逻辑,可以基于ITU-R BT.601或BT.709标准的公式手动计算,得到严格的YUV444分量。
以BT.601标准为例,转换公式如下:
Y = 0.299R + 0.587G + 0.114B
U = -0.14713R - 0.28886G + 0.436B + 128
V = 0.615R - 0.51499G - 0.10001*B + 128
示例代码:
import numpy as np from PIL import Image img_rgb = Image.open('input.jpg').convert('RGB') rgb_array = np.array(img_rgb).astype(np.float32) R, G, B = rgb_array[..., 0], rgb_array[..., 1], rgb_array[..., 2] # 计算YUV分量 Y = 0.299 * R + 0.587 * G + 0.114 * B U = (-0.14713 * R - 0.28886 * G + 0.436 * B) + 128 V = (0.615 * R - 0.51499 * G - 0.10001 * B) + 128 # 转换为8位整数格式的YUV444数组 yuv444_array = np.stack([Y, U, V], axis=-1).astype(np.uint8) # 转为PIL图像(可选) img_yuv444 = Image.fromarray(yuv444_array, mode='YCbCr')
内容的提问来源于stack exchange,提问作者mrgreen3325
相关产品推荐
相关产品推荐

