为什么opencv cvtColor会修改图像大小?

时间:2017-09-22 14:15:04

标签: image opencv colors yuv color-space

我希望这与色彩空间及其属性有更多关系。我试图将YUYV转换为灰度图像。我使用了以下函数调用:

cv::cvtColor(imgOrig, imgGray, cv::COLOR_YUV2GRAY_420);

使用此功能,我失去了一些图像的高度。我显然可以使用resize方法使原始图像足够大,以便转换不会删除任何实际数据,但想找出更适合的方法。

查看opencv源代码,下面是cvtColor方法的摘录:

case COLOR_YUV2GRAY_420:
        {
            if (dcn <= 0) dcn = 1;

            CV_Assert( dcn == 1 );
            CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0 && depth == CV_8U );

            Size dstSz(sz.width, sz.height * 2 / 3);
            _dst.create(dstSz, CV_MAKETYPE(depth, dcn));
            dst = _dst.getMat();
#ifdef HAVE_IPP
#if IPP_VERSION_X100 >= 201700
            if (CV_INSTRUMENT_FUN_IPP(ippiCopy_8u_C1R_L, src.data, (IppSizeL)src.step, dst.data, (IppSizeL)dst.step,
                                               ippiSizeL(dstSz.width, dstSz.height)) >= 0)
                break;
#endif
#endif
            src(Range(0, dstSz.height), Range::all()).copyTo(dst);
        }
        break;

您会看到在第8行,目标图像的大小是源图像大小的三分之二。

为什么会这样?什么是进行色彩空间转换的合适方法?

1 个答案:

答案 0 :(得分:1)

显然,这是YUV420的工作原理。从wikipedia开始,YUV使用6个字节来存储4个像素。这4个像素共享U, V值,同时具有自己的Y值。 conversion from YUV420 to RGB888 section中提供的图片和公式更好地解释了它。他们也很好地解释了支票的原因

CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0 && depth == CV_8U ); 以及为什么RGB只是YUV的2/3