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");
分享到:
相关推荐
在图像处理领域,图片格式转换是一项常见的任务。本主题聚焦于使用C语言将NV21格式...对于初学者来说,这是一个很好的学习C语言和图像处理原理的机会,而对于专业人士,这则提供了一个高效的工具来处理NV21格式的图片。
RGB888到NV21的转换是图像处理中常见的操作,主要应用于Android系统和一些视频编码、解码过程中。RGB888是一种常见的颜色格式,每个像素由红、绿、蓝三个分量组成,每个分量占用8位,总共24位。而NV21则是YUV420sp...
本文将详细讨论YUV和RGB两种颜色空间以及与之相关的NV12、NV21等格式,以及如何使用特定的工具来查看这些原始无压缩的数据。 首先,YUV是一种广泛用于数字视频的色彩空间,它将图像的颜色信息分为亮度(Y)和色度...
`rgbToNV21and12.py`和`rgb2NV21eachother.py`是两个Python脚本,它们分别实现了RGB到NV21/NV12以及NV21/NV12之间的转换。这两个脚本可能使用了OpenCV和PIL库,OpenCV是一个强大的计算机视觉库,支持多种图像和视频...
本文将详细讨论“YUV”和“NV12T”这两种颜色空间转换为“RGB”的过程,以及如何在Linux和Android平台上实现这种转换。 首先,我们需要理解YUV和NV12T颜色空间。YUV是一种广泛用于视频编码的颜色模型,它将颜色信息...
了解RGB与YUV_NV12之间的转换对于图像处理和视频编码至关重要,因为不同的颜色空间转换可以影响图像质量、存储需求和处理速度。掌握这些转换技巧,可以帮助我们更好地进行图像分析、编码和解码任务。
C语言实现rgb888转nv12/nv21
本程序实现了简单的YUV数据之间的转换和YUV与RGB的转换。 注:1、本程序只是简单YUV之间的颜色空间转换和YUV与RGB的转换。 2、本程序使用的vs2019创建的,需使用2019打开工程。 3、包含功能: 1)YV12_2_I420; ...
bmp/rgb24转成nv21/nv12的java代码,经实际测试是正确的,网上很多提供的JAVA代码实际上转换成来的格式不对,附件里是java的完整代码,直接编译即可生成face.nv21 face.nv12两种格式文件,可使用yuvplayer.exe打开...
在图像处理领域,YUV420sp(也称为NV21)是一种常见的颜色空间编码方式,主要用于视频压缩和传输,因为它比RGB等其他颜色空间更节省存储空间。本话题将深入探讨如何将YUV420sp转换为RGB,并涉及多线程优化。 首先,...
标题提到的“bmp/rgb24转成nv21/nv12的纯 c代码”涉及的是将位图(BMP)格式或者RGB24格式的图像数据转换为NV12或NV12这两种常见的YUV420格式。YUV色彩空间广泛应用于视频编码和解码,因为它可以有效地减少存储空间...
代码简单,直接下载,linux系统即可直接编译使用,输入是一个RGB24格式的文件。
C++中处理这种格式的数据通常涉及到对图像进行旋转、缩放以及色彩空间转换,如从NV21转换到BGR(或RGB)。本篇文章将深入探讨这些关键知识点。 首先,NV21格式的图像数据存储方式为:每个像素都有一个Y分量,然后每...
在处理相机预览和图像捕获时,理解YUV格式与NV21数组之间的转换至关重要。本文将深入探讨如何使用CameraX打开相机进行预览,并详细解释YUV数据如何转换为NV21数组。 ### 一、CameraX简介 CameraX是Google推出的一个...
Unity 工具之 YUV(YUV420 :I420,YV12,NV12,NV21)使用 shader 转为 RGB 显示 封装 YUV420ToRGBWrapper 1、首先根据 YUV 对应格式的 YUV 的排列方式,拆分 YUV; 2、然后,在通过 YUV 与 RGB 转换对应公式,进行...
总之,从UYVY到NV21的转换是一个基础但重要的图像处理任务,涉及到对不同图像格式的理解和内存操作。这个C语言的源代码实例提供了一个直观的起点,对于想要学习或移植此类功能的人来说,具有很高的参考价值。同时,...
Camera onPreview中byte[] 转换为Bitmap 在录像时设置了YV12要保存图片时 YV12或者NV12时要转换时所用的工具的优化
在图像和视频处理领域,颜色空间转换是一种常见的操作,用于适应不同的显示设备和处理需求。OpenCL(Open Computing Language)是一种跨平台的并行编程框架,特别适合利用GPU(Graphics Processing Unit)的强大计算...
rgb转yuv420sp_nv12的硬件加速,opengles 的shader实现
- 将NV21数据转换为RGB,因为OpenGL ES默认处理的是RGB格式的颜色数据。这通常通过编写一个片段着色器来完成,片段着色器会计算每个像素的RGB值。 - 使用glTexImage2D函数将YUV数据加载到纹理中,注意要正确处理NV...