[openCV学习]openCV函数cvtColor()中转为灰度图的背后数学理论

来源:互联网 发布:淘宝为什么让马云有钱 编辑:程序博客网 时间:2024/05/21 15:00

  • **图像处理中,经常会用到这个函数,现在让我们先看看这个函数的源码**

'''template<typename _Tp> struct RGB2Gray{    typedef _Tp channel_type;    RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn)    {        static const float coeffs0[] = { 0.299f, 0.587f, 0.114f };        memcpy( coeffs, _coeffs ? _coeffs : coeffs0, 3*sizeof(coeffs[0]) );        if(blueIdx == 0)            std::swap(coeffs[0], coeffs[2]);    }    void operator()(const _Tp* src, _Tp* dst, int n) const    {        int scn = srccn;        float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];        for(int i = 0; i < n; i++, src += scn)            dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr);    }    int srccn;    float coeffs[3];};'''


由上面的代码可以看得出来,我们的代码实现方法之一用的是公式:


有公式可知,B通道的分量占比最大,还有一种做法是直接把三个通道的数据叠加起来。


0 0