转换原理很简单,只要知道变换矩阵就简单了,这个可以参考一些《数字图像处理》相关书籍或者查维基就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 转的结果):