我希望这与色彩空间及其属性有更多关系。我试图将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行,目标图像的大小是源图像大小的三分之二。
为什么会这样?什么是进行色彩空间转换的合适方法?
答案 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
。