转换原理很简单,只要知道变换矩阵就简单了,这个可以参考一些《数字图像处理》相关书籍或者查维基就ok了。
import numpy as np import cv2 as cv def yuv2rgb(img): W = np.array([ [1, 0., 1.13983], [1, -0.39465, -0.58060], [1, 2.03211, 0.] ]) imc = img.copy() imc = imc.astype(np.float) h, w, c = imc.shape for i in range(h): for j in range(w): # imc[i, j][0] -= 16 # Y imc[i, j][1] -= 128 # U imc[i, j][2] -= 128 # V imc[i, j] = np.matmul(W, imc[i, j]) imc = imc.astype(np.uint8) return imc img = cv.imread('C:/Users/darkchii/Pictures/original_golden_bridge-300x169.jpg', cv.IMREAD_UNCHANGED) im1 = cv.cvtColor(img, cv.COLOR_RGB2YUV) im2 = yuv2rgb(im1) im3 = cv.cvtColor(im1, cv.COLOR_YUV2RGB) cv.imshow('1', img) cv.imshow('2', im1) cv.imshow('3', im2) cv.imshow('4', im3) cv.waitKey(0)
测试结果(图 1 是 RGB 图,图 2 是使用 opencv RGB2YUV 转的,图 3 是自己编写的 YUV2RGB 转的结果,图 4 是使用 opencv 的 YUV2RGB 转的结果):