为什么OpenCV RGB到YCbCr的转换与使用ycbcr2rgb函数的matlab中的转换没有相同的结果?

问题描述 投票:2回答:1

我试图用OpenCV将我的matlab代码复制到C中。在这里,我有一个步骤,我需要将图像从rgb转换为ycbcr并进行直方图均衡。但是matlab和C的结果都非常不同。

我使用的是Matlab R2016b和OpenCV 4.0.0

哪一个是正确的方法,为什么我看到这种差异?

我在MATLAB和C中遵循的步骤如下:

C步骤:

  1. 使用imread()读取RGB中的图像帧
  2. 使用cv :: cvtColor()将RGB图像转换为YCBCr
  3. 检查Y通道的值 cv::Mat image, ycbcr; vector splitted; image = imread("image_name.jpg"); cv::cvtColor(image, ycbcr, COLOR_BGR2YCrCb); cv::split(ycbcr, splitted) cv::equalizeHist(splitted[0],splitted[0]); cv::merge(dst_host,ycbcr); cv::cvtColor(ycbcr, image, COLOR_YCrCb2BGR); imshow("Equalized", image);

MATLAB步骤:

  1. 使用imread()读取RGB中的图像帧
  2. 使用rgb2ycbcr()将RGB图像转换为YCBCr
  3. 检查Y通道的值 im = imread('image_name.jpg'); ycbcr_im = rgb2ycbcr(im); ycbcr_im(:,:,1) = histeq(ycbcr_im(:,:,1)); im = ycbcr2rgb(ycbcr_im); imshow(im);

所以我在OpenCV和MATLAB中从rgb转换为ycbcr之后检查了结果,结果在转换本身是不同的。

matlab opencv rgb color-conversion
1个回答
3
投票

通过查看OpenCV和Matlab颜色转换的文档。我找到了以下内容。在我的观察中,算法和实现存在重大差异。

在Matlab中,rgb2ycbcr()函数转换数字公式中的颜色

Y = 16+ (65.481 * R + 128.553 * G + 24.966 * B)
Cb = 128+ (-37.797 * R - 74.203 * G + 112.0 * B)
Cr = 128+ (112.0 * R - 93.786 * G - 18.214 * B)

如果输入为uint8,则YCBCR为uint8,其中Y在[16 235]范围内,Cb和Cr在[16 240]范围内。

但是在OpenCV中,转换是在模拟公式中完成的,

Y = 0.299 * R+ 0.587 * G+ 0.114 * B
Cb = -0.168736 * R - 0.331264 * G + 0.5 * B
Cr = 0.5 * R - 0.418688 * G - 0.081312 * B

如果输入是uint8,那么YCBCR是uint8,其中Y和Cb和Cr在[0 255]范围内。这就是为什么你得到不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.