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语言)。 NV21 转 RGB24 格式。 NV21 转 BMP 格式图片源码。 直接可以用。
本程序实现了简单的YUV数据之间的转换和YUV与RGB的转换。 注:1、本程序只是简单YUV之间的颜色空间转换和YUV与RGB的转换。 2、本程序使用的vs2019创建的,需使用2019打开工程。 3、包含功能: 1)YV12_2_I420; ...
C语言实现rgb888转nv12/nv21
rgb转换为nv12格式,并保存为raw。 nv12转换为rgb格式,并保存为bmp。
完整c源代码,直接编译即可测试,方便简单,编译移植,nv21网上资源比较少,需要测试rgb图片里面也已经放了两张供测试用,大家共同学习共同进步
可以直接打开 YUV NV21 NV12 YUV420 YUV444 YUV422 RGB16 RGB24 RGB32 RGBA等格式的从内存中直接保存的原始无压缩图片
python3 脚本 依赖opencv3 PIL,能够将jpg和NV21、NV12格式相互转化,附带YUV文件查看器 修改自大佬原有的代码,侵删
YUV和NV12T转RGB的一个小工具,可以在linux和android上边使用。
附件提供bmp格式或rgb24格式转换成NV12或NV21格式的函数,纯C代码,并附有测试用例和测试用的bmp文件,提供makefile,可直接编译成X86和ARM平台的可执行文件。
关于YUV420sp即NV21格式的图像解码
Unity 工具之 YUV(YUV420 :I420,YV12,NV12,NV21)使用 shader 转为 RGB 显示 封装 YUV420ToRGBWrapper 1、首先根据 YUV 对应格式的 YUV 的排列方式,拆分 YUV; 2、然后,在通过 YUV 与 RGB 转换对应公式,进行...
代码简单,直接下载,linux系统即可直接编译使用,输入是一个RGB24格式的文件。
bmp/rgb24转成nv21/nv12的java代码,经实际测试是正确的,网上很多提供的JAVA代码实际上转换成来的格式不对,附件里是java的完整代码,直接编译即可生成face.nv21 face.nv12两种格式文件,可使用yuvplayer.exe打开...
Camera onPreview中byte[] 转换为Bitmap 在录像时设置了YV12要保存图片时 YV12或者NV12时要转换时所用的工具的优化
rgb转yuv420sp_nv12的硬件加速,opengles 的shader实现
Android常用的几种格式:NV21/NV12/YV12/YUV420P相互转换 java代码, YV12 To NV21, I420 To NV21,YV12Resize, flipYUV420, NV21ToBitmap
java视频格式NV21/NV12/YV12/YUV420P的转换.....................................
摄像头格式YUYV转成NV21格式代码的java代码实现。直接可以使用
C++实现将NV21缩放,旋转,以及转换成BGR等一系列操作,低耗时
C和SSE优化代码将RGB转换为NV12色彩空间。 NV12格式定义: NV12格式是YUV 4:2:0格式,其在内存中的顺序是第一个Y平面,然后是在交错的UV平面中压缩的色度样本。 例子: YYYYYY YYYYYY 紫外线 RGB颜色格式,指的是...