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

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

'''
template 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通道的分量占比最大,还有一种做法是直接把三个通道的数据叠加起来。


你可能感兴趣的:(opencv学习)