原理
YCbCr到RGB的转换
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16
Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128
函数使用举例
注意事项
输入:0-1的浮点型numpy矩阵代表RGB空间
输出:0-255的浮点型numpy矩阵代表YCbCr空间
image.shape为[W*H*C]
的RGB图像
使用情况1
当image每一个像素点的取值范围为0-255时候
需要先转换成0-1,因为在下面的源码分析中可以看到他给的相乘系数是65.481 … -18.214 这些是针对已经归一化到0-1的数值来讲的系数
否则这个系数和后面的16,128等偏移就不会对应了
from skimage.color import rgb2ycbcr
image_rgb = image_rgb/255.0#此时可以转换成浮点型
image_ycbcr = rgb2ycbcr(image_rgb)
此时输出为0-255的浮点型YCbCr空间图像
使用情况2
当image每一个像素点的取值范围为0-1时候
from skimage.color import rgb2ycbcr
image_ycbcr = rgb2ycbcr(image_rgb)
此时输出为0-255的浮点型YCbCr空间图像
源码解释说明
# 空间转换所需要的使用到的参数
ycbcr_from_rgb = np.array([[ 65.481, 128.553, 24.966],
[ -37.797, -74.203, 112.0 ],
[ 112.0 , -93.786, -18.214]])
# 通用做图像空间变换的转换函数
def _convert(matrix, arr):
"""Do the color space conversion.
Parameters
----------
matrix : array_like
The 3x3 matrix to use.
arr : (..., 3) array_like
The input array. Final dimension denotes channels.
Returns
-------
out : (..., 3) ndarray
The converted array. Same dimensions as input.
"""
arr = _prepare_colorarray(arr)
return arr @ matrix.T.astype(arr.dtype)
# 将RGB图像通过转换矩阵转换成YCbCr
def rgb2ycbcr(rgb):
"""RGB to YCbCr color space conversion.
Parameters
----------
rgb : (..., 3) array_like
The image in RGB format. Final dimension denotes channels.
Returns
-------
out : (..., 3) ndarray
The image in YCbCr format. Same dimensions as input.
Raises
------
ValueError
If `rgb` is not at least 2-D with shape (..., 3).
Notes
-----
Y is between 16 and 235. This is the color space commonly used by video
codecs; it is sometimes incorrectly called "YUV".
References
----------
.. [1] https://en.wikipedia.org/wiki/YCbCr
"""
arr = _convert(ycbcr_from_rgb, rgb)
arr[..., 0] += 16
arr[..., 1] += 128
arr[..., 2] += 128
return arr
LAST、参考文献
YCbCr与YUV的区别_machh的专栏-CSDN博客_yuv和ycbcr的区别
scikit-image/simple_metrics.py at main · scikit-image/scikit-image · GitHub
scikit-image/colorconv.py at main · scikit-image/scikit-image · GitHub