为什么OpenCV RGB到YCbCr的转换不';在matlab中使用ycbcr2rgb函数进行转换时,是否给出相同的结果?
我试图用OpenCV将我的matlab代码复制到C中。这里我有一个步骤,我需要将图像从rgb转换为ycbcr,并进行直方图均衡化。但是matlab和C语言的计算结果却相差很大 我正在使用MatlabR2016B和OpenCV 4.0.0 哪种方法是正确的,为什么我会看到这种差异 我在MATLAB和C中遵循的步骤如下所述: C步骤:为什么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; 向量分裂;
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(“均衡”,图像);
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)一个用于视频/电视(第一个是限制范围),第二个用于照片(全范围)。