`
daojin
  • 浏览: 689987 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

NV21和RGB互相转换的工具

 
阅读更多
nv21Tojpg

#!/usr/bin/env python3
import cv2
import numpy as np

import glob


def convert_fhq(h, w, msg):
    img_y=np.fromstring(msg[:h*w],dtype='uint8').reshape((h,w)).astype('int32')
    img_u=np.fromstring(msg[h*w:h*w+h*w//2:2],dtype='uint8').reshape((h//2,w//2)).astype('int32')
    img_v=np.fromstring(msg[h*w+1:h*w+h*w//2:2],dtype='uint8').reshape((h//2,w//2)).astype('int32')
    ruv=((359*(img_v-128))>>8)
    guv=-1*((88*(img_u-128)+183*(img_v-128))>>8)
    buv=((454*(img_u-128))>>8)
    ruv=np.repeat(np.repeat(ruv,2,axis=0),2,axis=1)
    guv=np.repeat(np.repeat(guv,2,axis=0),2,axis=1)
    buv=np.repeat(np.repeat(buv,2,axis=0),2,axis=1)
    img_r=(img_y+ruv).clip(0,255).astype('uint8')
    img_g=(img_y+guv).clip(0,255).astype('uint8')
    img_b=(img_y+buv).clip(0,255).astype('uint8')
    img=np.dstack([img_b[:,:,None],img_g[:,:,None],img_r[:,:,None]])
    img=img.transpose((1,0,2))[::-1].copy()
    #img = cv2.resize(img,(0,0),fx=0.25,fy=0.25)
    return img[:,:,::-1].copy()


h, w = 480, 640

for i in glob.glob('*.raw'):
    img = convert_fhq(h, w, open(i, 'rb').read())
    cv2.imwrite(i + '.png', img)


jpg2nv21
#!/usr/bin/env python3
import numpy as np
import glob
from PIL import Image
import cv2
def my_open_jpg(filename):
    "open a jpg file and return a file object"
    return Image.open(filename);

def my_jpg2nv21(im_jpg):
    "conver a jpg file to yuv file"
    #if(len(im_jpg.split())==4):
    #    r,g,b,a=im_jpg.split();
    #else:
    r,g,b=im_jpg.split();

    width,height=im_jpg.size;
    print(width)
    print(height)
    im_new=list(range(int(width*height*3/2)));
    r = list(r.getdata())
    g = list(g.getdata())
    b = list(b.getdata())
    Y,U,V = 0,0,0
    for xi in range(height):
        for xj in range(width):
            i = (xi//2)*2;
            j = (xj//2)*2;
            index1 = i*width+j
            index2 = i*width+j + 1
            index3 = (i + 1)*width + j;
            index4 = (i + 1)*width + j + 1
            R = (r[index1] + r[index2] + r[index3] + r[index4])//4
            G = (g[index1] + g[index2] + g[index3] + g[index4])//4
            B = (b[index1] + b[index2] + b[index3] + b[index4])//4
            #Y = k_r*R + k_g*G + k_b*B;
            Y,U,V = rgb_to_ycbcr(R, G, B)
            im_new[int(width*height+i//2*width+j)] = V;
            im_new[int(width*height+i//2*width+j+1)] = U;
            im_new[xi*width+xj]=Y;
    return im_new;
def my_save_yuv(filename,im_new):
    #use the numpy to write the data to file
    fp = open(filename,"wb");

    data=np.array(im_new,"B");
    data.tofile(fp);
    fp.close();
    print("save yuv file %s successfully",  filename)

def rgb_to_ycbcr(R, G, B):
    assert(255>=R)
    assert(255>=G)
    assert(255>=B)
    Y = 0.298*R + 0.612*G + 0.117*B;
    U = -0.168*R - 0.330*G + 0.498*B + 128;
    V = 0.449*R - 0.435*G - 0.083*B + 128;
    return int(Y), int(U), int(V)

def rgb2ycbcr(im):
    xform = np.array([[.299, .587, .114], [-.1687, -.3313, .5], [.5, -.4187, -.0813]])
    ycbcr = im.dot(xform.T)
    ycbcr[:,:,[1,2]] += 128
    return np.uint8(ycbcr)

def ycbcr2rgb(im):
    xform = np.array([[1, 0, 1.402], [1, -0.34414, -.71414], [1, 1.772, 0]])
    rgb = im.astype(np.float)
    rgb[:,:,[1,2]] -= 128
    rgb = rgb.dot(xform.T)
    np.putmask(rgb, rgb > 255, 255)
    np.putmask(rgb, rgb < 0, 0)
    return np.uint8(rgb)

if __name__ == "__main__":
    h, w = 480, 640
    for file in glob.glob('*.jpg'):
        img = my_open_jpg(file)
        print(img);
        yuv = my_jpg2nv21(img)
        yuvFileName = file + ".yuv"
        my_save_yuv(yuvFileName,yuv)

        #png file name to test
        pngFileName = file + "1.jpg"
        fin = open(yuvFileName,"rb")
        img_nv21 = np.fromstring(fin.read(h * w * 3 // 2), dtype=np.uint8)
        img_nv21 = img_nv21.reshape((h + h // 2, w))
        img = cv2.cvtColor(img_nv21, cv2.COLOR_YUV2BGR_NV21)
        cv2.imwrite(pngFileName, img)
    print("end");

分享到:
评论

相关推荐

    图片格式 NV21 转 RGB24 和 BMP图片源码(C语言)。

    在图像处理领域,图片格式转换是一项常见的任务。本主题聚焦于使用C语言将NV21格式...对于初学者来说,这是一个很好的学习C语言和图像处理原理的机会,而对于专业人士,这则提供了一个高效的工具来处理NV21格式的图片。

    RGB888转NV21(yuv420sp)源代码详解

    RGB888到NV21的转换是图像处理中常见的操作,主要应用于Android系统和一些视频编码、解码过程中。RGB888是一种常见的颜色格式,每个像素由红、绿、蓝三个分量组成,每个分量占用8位,总共24位。而NV21则是YUV420sp...

    YUV(NV12 NV21等) RGB(16,24,32位) 原始数据(无压缩)的图片和视频查看工具

    本文将详细讨论YUV和RGB两种颜色空间以及与之相关的NV12、NV21等格式,以及如何使用特定的工具来查看这些原始无压缩的数据。 首先,YUV是一种广泛用于数字视频的色彩空间,它将图像的颜色信息分为亮度(Y)和色度...

    NV21、NV12、JPG互相转换python脚本

    `rgbToNV21and12.py`和`rgb2NV21eachother.py`是两个Python脚本,它们分别实现了RGB到NV21/NV12以及NV21/NV12之间的转换。这两个脚本可能使用了OpenCV和PIL库,OpenCV是一个强大的计算机视觉库,支持多种图像和视频...

    YUV和NV12T转RGB

    本文将详细讨论“YUV”和“NV12T”这两种颜色空间转换为“RGB”的过程,以及如何在Linux和Android平台上实现这种转换。 首先,我们需要理解YUV和NV12T颜色空间。YUV是一种广泛用于视频编码的颜色模型,它将颜色信息...

    rgb 和 yuv_nv12 数据相互转换

    了解RGB与YUV_NV12之间的转换对于图像处理和视频编码至关重要,因为不同的颜色空间转换可以影响图像质量、存储需求和处理速度。掌握这些转换技巧,可以帮助我们更好地进行图像分析、编码和解码任务。

    C语言实现rgb888转nv12/nv21

    C语言实现rgb888转nv12/nv21

    YUV颜色空间转换(YV12、NV12、NV21、I420、RGB等)

    本程序实现了简单的YUV数据之间的转换和YUV与RGB的转换。 注:1、本程序只是简单YUV之间的颜色空间转换和YUV与RGB的转换。 2、本程序使用的vs2019创建的,需使用2019打开工程。 3、包含功能: 1)YV12_2_I420; ...

    bmp/rgb24格式转成nv21/nv12格式的java代码

    bmp/rgb24转成nv21/nv12的java代码,经实际测试是正确的,网上很多提供的JAVA代码实际上转换成来的格式不对,附件里是java的完整代码,直接编译即可生成face.nv21 face.nv12两种格式文件,可使用yuvplayer.exe打开...

    yuv420sp(NV21)转RGB的核心代码以及多线程

    在图像处理领域,YUV420sp(也称为NV21)是一种常见的颜色空间编码方式,主要用于视频压缩和传输,因为它比RGB等其他颜色空间更节省存储空间。本话题将深入探讨如何将YUV420sp转换为RGB,并涉及多线程优化。 首先,...

    bmp/rgb24转成nv21/nv12的纯 c代码并包含测试代码和文件

    标题提到的“bmp/rgb24转成nv21/nv12的纯 c代码”涉及的是将位图(BMP)格式或者RGB24格式的图像数据转换为NV12或NV12这两种常见的YUV420格式。YUV色彩空间广泛应用于视频编码和解码,因为它可以有效地减少存储空间...

    rgb24转nv21纯 c代码

    代码简单,直接下载,linux系统即可直接编译使用,输入是一个RGB24格式的文件。

    NV21 旋转缩放转BGR

    C++中处理这种格式的数据通常涉及到对图像进行旋转、缩放以及色彩空间转换,如从NV21转换到BGR(或RGB)。本篇文章将深入探讨这些关键知识点。 首先,NV21格式的图像数据存储方式为:每个像素都有一个Y分量,然后每...

    打开相机并预览,yuv转nv21数组

    在处理相机预览和图像捕获时,理解YUV格式与NV21数组之间的转换至关重要。本文将深入探讨如何使用CameraX打开相机进行预览,并详细解释YUV数据如何转换为NV21数组。 ### 一、CameraX简介 CameraX是Google推出的一个...

    Unity 工具之 YUV 使用 Shader 转为 RGB 显示封装 YUV420ToRGBWrapper

    Unity 工具之 YUV(YUV420 :I420,YV12,NV12,NV21)使用 shader 转为 RGB 显示 封装 YUV420ToRGBWrapper 1、首先根据 YUV 对应格式的 YUV 的排列方式,拆分 YUV; 2、然后,在通过 YUV 与 RGB 转换对应公式,进行...

    uyvy(yuv422)转nv21(yuv420)源代码详解

    总之,从UYVY到NV21的转换是一个基础但重要的图像处理任务,涉及到对不同图像格式的理解和内存操作。这个C语言的源代码实例提供了一个直观的起点,对于想要学习或移植此类功能的人来说,具有很高的参考价值。同时,...

    Yv12 nv21 yuv420 转换为Bitmap

    Camera onPreview中byte[] 转换为Bitmap 在录像时设置了YV12要保存图片时 YV12或者NV12时要转换时所用的工具的优化

    opencl GPU加速rgb24与yuv444p格式相互转换核函数参考

    在图像和视频处理领域,颜色空间转换是一种常见的操作,用于适应不同的显示设备和处理需求。OpenCL(Open Computing Language)是一种跨平台的并行编程框架,特别适合利用GPU(Graphics Processing Unit)的强大计算...

    rgb转yuv420sp_nv12 硬件加速(opengl es,shader)

    rgb转yuv420sp_nv12的硬件加速,opengles 的shader实现

    opengles渲染NV21

    - 将NV21数据转换为RGB,因为OpenGL ES默认处理的是RGB格式的颜色数据。这通常通过编写一个片段着色器来完成,片段着色器会计算每个像素的RGB值。 - 使用glTexImage2D函数将YUV数据加载到纹理中,注意要正确处理NV...

Global site tag (gtag.js) - Google Analytics