import numpy as np from scipy import ndimage def ConvertYUVtoRGB(yuv_planes) plane_y = yuv_planes[0] plane_u = yuv_planes[1] plane_v = yuv_planes[2] height = plane_y.shape[0] width = plane_y.shape[1] # upsample if YV12 plane_u = ndimage.zoom(plane_u, 2, order=0) plane_v = ndimage.zoom(plane_v, 2, order=0) # alternativelly can perform upsampling with numpy.repeat() #plane_u = plane_u.repeat(2, axis=0).repeat(2, axis=1) #plane_v = plane_v.repeat(2, axis=0).repeat(2, axis=1) # reshape plane_y = plane_y.reshape((plane_y.shape[0], plane_y.shape[1], 1)) plane_u = plane_u.reshape((plane_u.shape[0], plane_u.shape[1], 1)) plane_v = plane_v.reshape((plane_v.shape[0], plane_v.shape[1], 1)) # make YUV of shape [height, width, color_plane] yuv = np.concatenate((plane_y, plane_u, plane_v), axis=2) # according to ITU-R BT.709 yuv[:,:, 0] = yuv[:,:, 0].clip(16, 235).astype(yuv.dtype) - 16 yuv[:,:,1:] = yuv[:,:,1:].clip(16, 240).astype(yuv.dtype) - 128 A = np.array([[1.164, 0.000, 1.793], [1.164, -0.213, -0.533], [1.164, 2.112, 0.000]]) # our result rgb = np.dot(yuv, A.T).clip(0, 255).astype('uint8') return rgb
Based on this discussion on stackoverflow.
See also: color conversion.
Nice work. I'm not sure what the one line of code you are referring to for upsampling is. Would it be one of the two lines you have commented out?
ReplyDelete