通道
OpenCV的核心处理对象是Mat,大体是一个二维数组,加上了各种功能函数。
很多的图像处理,会在单通道或二值化的基础上进行,比如连通域、目标识别等。这里的通道就是channels。
不同的图像处理算法可能对通道数有特定的要求。例如,一些算法可能只能处理单通道图像,而其他算法可能可以利用多通道图像中的信息来实现更复杂的处理。
在OpenCV中,Mat类的channels实际上和每个元素上存储的数据有关,例如存储的是Point3f,channel就自动为3。具体来说,图像是由一个个像素点堆积而成的,而一个像素点,又是由RGB颜色混合而成的。每一种颜色就是一种通道,每个像素点是多个通道颜色的混合结果。
使用Mat.channels()方法可以得到当前Mat的通道数,通常返回结果值为1、2、3或4。
在OpenCV中,除了使用Mat.channels()方法,还可以通过以下方法获取图像的通道数:
- 通过图像属性查看:在图像的详细信息中,如果位深度为8,则为单通道(灰度图);位深度为24是三通道;位深度为32是四通道。
- 使用img.shape()[2]方法:该方法返回图像的通道数,其中img.shape()表示图像的维度,索引为2的元素为通道数。
那就简单理解。
OpenCV 处理
当然,对编程来说,光知道通道数是多少,并没有什么大用,应该要取得某个通道的图像才是目的,这也是各图像的内在本质。
OpenCV中,获取各通道图像是采用split函数
std::vector<cv::Mat> channels;
split(dstMat, channels);
dstMat = channels[channelType];
split的参数很简单,无需折腾。如果非要加参数的话,那就是通道序号。
灰度图
而灰度图也是单通道的,不过它的数据是由RGB分量计算而得,不是取得其中一个。
从数学的角度来看,结果都是 f(R, G, B, A),单通道是R/G/B/A中的一个,灰度是其余逻辑,如0.299×R+0.587G+0.114B
那就一块处理了。