Yuv转bmp,截取

如果BMP图像的颜色看起来不正常,这可能是由于YUV到RGB转换中的一个常见问题:颜色空间转换不正确或者UV分量的处理不当。在处理NV12格式时,我们需要正确处理UV分量,并确保使用正确的颜色转换公式。

下面是一些可能的解决方案:

  1. 确保UV分量处理正确:在NV12格式中,UV分量是交错存储的。需要确保这些分量被正确地解析和转换。

  2. 正确的颜色转换:使用正确的YUV到RGB转换公式。在OpenCV中,使用正确的转换标志。

  3. 调整YUV数据的布局:可能需要调整YUV数据的布局以适应OpenCV的期望格式。

让我们对之前的代码进行调整,确保UV分量被正确处理,并再次尝试转换:

import numpy as np
import cv2

def read_yuv420_nv12(filename, width, height):
    with open(filename, 'rb') as f:
        yuv_data = np.frombuffer(f.read(), dtype=np.uint8)

    # 分别提取Y, U, V分量
    y = yuv_data[0:width*height].reshape(height, width)
    uv = yuv_data[width*height:].reshape(height//2, width)

    # 将UV分量转换为CrCb格式
    u = uv[:, 0::2].reshape(height//2, width//2).repeat(2, axis=0).repeat(2, axis=1)
    v = uv[:, 1::2].reshape(height//2, width//2).repeat(2, axis=0).repeat(2, axis=1)

    # 合并YUV分量
    yuv = np.dstack((y, u, v)).astype(np.uint8)

    return yuv

def convert_nv12_to_bmp(yuv, output_file):
    # YUV NV12转RGB
    rgb = cv2.cvtColor(yuv, cv2.COLOR_YUV2RGB_NV12)

    # 保存为BMP格式
    cv2.imwrite(output_file, rgb)

# 示例:读取和转换图像
filename = 'your_yuv_file.yuv'
width, height = 640, 480 # 替换为实际的宽度和高度
yuv = read_yuv420_nv12(filename, width, height)
convert_nv12_to_bmp(yuv, 'output.bmp')

这个调整的代码更加精确地处理了UV分量,确保它们被正确地转换为CrCb格式,然后与Y分量合并。试试这个修改后的代码,并检查输出的BMP图像的颜色是否正常。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值