最近学习PS中图像如何进行色度处理的,并参考网上很多大侠的文章,将其图像处理过程整理一下,其运行环境为PYTHON, OPENCV, NUMPY:
一般情况由于视频输出为YUV图像
第一步:YUV RGB转换
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 图像转换使用OPENCV的库完成,使用NP从文件加载单张YUV图片,如果是YUV视频文件,需要调整文件阅读的偏移量。
def yuv_import(filename, width, height):
size = width * height;
yuv = np.fromfile(filename, dtype='uint8')
img = yuv.reshape((height * 3 // 2, width)).astype('uint8')
src11 = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_I420)
cv2.imshow('input_image1', src11)
cv2.waitKey(0)
第二步:由于摄像头的光照问题,先去图像的暗角,参考如下博客
图像增强系列之图像自动去暗角算法。 - Imageshop - 博客园 (cnblogs.com)
第三步: 对图像进行色度调整,增强图像效果
def WhiiteBlack(img, Shadow, Highlight, Midtones):
if Highlight > 255:
Highlight = 255
if Shadow < 0:
Shadow = 0
if Shadow >= Highlight:
Shadow = Highlight - 2
if Midtones > 3.0:
Midtones = 3.0
if Midtones < 0.3:
Midtones = 0.3
maptable = np.arange(256)
maptable = np.array(maptable, dtype=int)
Diff = Highlight - Shadow
exponent = 1.0 / Midtones;
coe = 255.0 / Diff
rgbDiff = (maptable - Shadow) * coe
rgbDiff = np.maximum(rgbDiff, 0)
rgbDiff = np.minimum(rgbDiff, 255)
rgbDiff = rgbDiff / 255.0
rgbDiff = np.power(rgbDiff, exponent) * 255.0 + 0.5
rgbDiff = np.around(rgbDiff, 0)
rgbDiff = rgbDiff.astype('uint8')
result = cv2.LUT(img, rgbDiff)
cv2.imshow('input_image1', result)
cv2.waitKey(0)
return result
第四步:图像颜色空间的调整,用于图像拼接
使用OPENCV中的cvtColor函数,转变RGB为LAB
cv::cuda::cvtColor(gpuSrcImage, gpuDstImage, cv::COLOR_BGR2Lab);
第五步:图像颜色区域的均值与标准差
对于标准RECT区域可以使用opencv::meanStdDev来计算,对于非RECT图像,需要编写CUDA KERNEL来计算,对于实时行不高的场景,可以将图像数据拷贝到内存,运用CPU进行计算
第六步:为图像拼接进行LAB数据修正
其原理是运用一张图像的均值与标准差与另外一张图像均值与标准差进行图像亮度与色度修正。
(Val - meanR)*(stdL) / (stdR) + meanL (- Diff) 关于DIFF的值修正可以使用对数函数进行微调;