为什么OpenCV RGB到YCbCr的转换不';在matlab中使用ycbcr2rgb函数进行转换时,是否给出相同的结果?

为什么OpenCV RGB到YCbCr的转换不';在matlab中使用ycbcr2rgb函数进行转换时,是否给出相同的结果?,matlab,opencv,rgb,color-conversion,Matlab,Opencv,Rgb,Color Conversion,我试图用OpenCV将我的matlab代码复制到C中。这里我有一个步骤,我需要将图像从rgb转换为ycbcr,并进行直方图均衡化。但是matlab和C语言的计算结果却相差很大 我正在使用MatlabR2016B和OpenCV 4.0.0 哪种方法是正确的,为什么我会看到这种差异 我在MATLAB和C中遵循的步骤如下所述: C步骤: 使用imread()读取RGB中的图像帧 使用cv::cvtColor()将RGB图像转换为YCBCr 检查Y通道的值 cv::Mat图像,ycbcr; 向量分裂;

我试图用OpenCV将我的matlab代码复制到C中。这里我有一个步骤,我需要将图像从rgb转换为ycbcr,并进行直方图均衡化。但是matlab和C语言的计算结果却相差很大

我正在使用MatlabR2016B和OpenCV 4.0.0

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

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

C步骤:

  • 使用imread()读取RGB中的图像帧

  • 使用cv::cvtColor()将RGB图像转换为YCBCr

  • 检查Y通道的值

    
    cv::Mat图像,ycbcr;
    向量分裂;
    image=imread(“image_name.jpg”);
    cv::cvtColor(图像、ycbcr、颜色);
    cv::拆分(ycbcr,拆分)
    cv::equalizeHist(拆分[0],拆分[0]);
    cv::合并(dst_主机,ycbcr);
    cv::cvtColor(ycbcr、图像、颜色_YCrCb2BGR);
    imshow(“均衡”,图像);
    

  • MATLAB步骤:

  • 使用imread()读取RGB中的图像帧

  • 使用rgb2ycbcr()将RGB图像转换为YCBCr

  • 检查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后的结果,结果在转换本身上是不同的。

    通过查看OpenCV和MATLAB颜色转换的文档。我发现了以下几点。根据我的观察,在算法和实现上有很大的不同

    在Matlab中, 函数的作用是:转换数字公式中的颜色

    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在[16235]范围内,Cb和Cr在[16240]范围内

    但是在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]内。这就是您得到不同结果的原因。

    您使用的是哪个操作系统?您无法使用
    imread()
    在OpenCV中读取RGB中的图像。您将获得BGR,并且必须使用相应的
    cvtColor()
    ,其中包含BGR。我使用的是Ubuntu 18.04,这不是您的问题所说的…@MarkSetchell我使用的是COLOR\u BGR2YCrCb宏。这是在OpenCV中从RGB转换为YCbCr的代码。cv::cvtColor(src、dst、COLOR_BGR2YCrCb)一个用于视频/电视(第一个是限制范围),第二个用于照片(全范围)。