如何用Python将Y视频原始缓冲区及YUV422_SEMI_PLANAR格式y.raw转为图像?
没问题,我来帮你搞定这两个需求——不管是单独的Y平面原始文件转成PNG/JPG,还是把Y视频缓冲区直接转成图像,用Python都能轻松实现。下面分两种情况详细说明:
一、将YUV422_SEMI_PLANAR的Y平面原始文件(y.raw)转为PNG/JPG
首先要明确:单独的Y平面数据只有亮度信息,转出来的是灰度图像。要完成转换,你需要知道两个关键参数:图像的实际宽度和高度(比如1920×1080、1280×720等),因为原始文件是无格式的二进制数据,必须按正确的尺寸还原成图像矩阵。
步骤1:安装依赖库
我们需要用numpy处理二进制数据转数组,用Pillow(PIL的分支)来保存图像。执行以下命令安装:
pip install numpy pillow
步骤2:转换代码示例
import numpy as np from PIL import Image # ********* 必须替换为你的图像实际尺寸 ********* width = 1920 height = 1080 # 读取Y平面原始文件的二进制数据 with open('y.raw', 'rb') as f: y_raw_data = f.read() # 将二进制数据转为numpy数组,格式为uint8(单字节无符号整数,对应图像的0-255灰度值) y_array = np.frombuffer(y_raw_data, dtype=np.uint8).reshape((height, width)) # 转换为PIL灰度图像(mode='L'表示8位灰度) gray_image = Image.fromarray(y_array, mode='L') # 保存为PNG或JPG gray_image.save('output_y_gray.png') # 如果要保存JPG,可以调整质量参数(1-95,默认75) # gray_image.save('output_y_gray.jpg', quality=95)
注意事项
- 如果图像显示变形,说明你填的
width和height不对,要核对原始视频的分辨率。 - 如果不确定分辨率,可以尝试常见的视频分辨率组合,或者通过文件大小反推:
文件字节数 = width × height(因为每个Y像素占1字节)。
二、将Y视频原始缓冲区转换为图像
这里的“Y视频原始缓冲区”一般指内存中的Y平面数据(比如从视频流、解码后的帧缓冲区中获取的bytes数据),处理逻辑和文件读取类似,只是跳过了文件读取步骤,直接用内存中的数据即可。
代码示例(灰度图像)
import numpy as np from PIL import Image # ********* 替换为实际参数 ********* width = 1920 height = 1080 # 假设y_buffer是你从视频流中获取到的Y平面二进制数据(bytes类型) y_buffer = b'' # 将缓冲区数据转为numpy数组并重塑为图像尺寸 y_array = np.frombuffer(y_buffer, dtype=np.uint8).reshape((height, width)) # 转成图像并保存 gray_image = Image.fromarray(y_array, mode='L') gray_image.save('video_frame_gray.png')
扩展:如果是完整的YUV422_SEMI_PLANAR帧(含U、V通道)
如果你拿到的是完整的YUV422_SEMI_PLANAR帧数据(而不是单独的Y平面),可以转换为彩色图像。这里推荐用OpenCV来处理,因为它内置了标准的YUV转RGB逻辑,更准确:
首先安装OpenCV:
pip install opencv-python
然后代码示例:
import cv2 import numpy as np width = 1920 height = 1080 # 假设yuv_buffer是完整的YUV422_SEMI_PLANAR帧数据(总字节数=width×height×2) yuv_buffer = b'' # 将二进制数据转为numpy数组,YUV422_SEMI_PLANAR的shape是(height, width×2) yuv_array = np.frombuffer(yuv_buffer, dtype=np.uint8).reshape((height, width * 2)) # 转换为BGR格式(OpenCV默认用BGR,转RGB可以再加一步转换) bgr_image = cv2.cvtColor(yuv_array, cv2.COLOR_YUV2BGR_NV16) # 保存彩色图像 cv2.imwrite('color_frame.png', bgr_image) # 如果需要用PIL保存RGB格式的图像: from PIL import Image rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) Image.fromarray(rgb_image).save('color_frame_rgb.png')
内容的提问来源于stack exchange,提问作者Rajesh Gopu
相关产品推荐
相关产品推荐

