? ? ? ? 前面介绍过了灰度图,在这种颜色空间下,像素值代表像素的亮度信息,取值范围为[0,255]。在图像处理领域,除了灰度图,常用的颜色空间还有以下几种:
? ? ? ? 由蓝( Blue )、绿( Green )、红( Red )三个通道组成。每个通道的值范围是[0,255] ,代表了颜色的强度。BGR颜色空间也是Emgu.CV默认打开图片的颜色空间格式。这里要注意三个颜色通道的顺序,和我们常见的RGB是反的。
? ? ? ? 这种颜色空间,最适用于图像显示,但是对于图像分析,往往不太合适。
? ? ? ? 在图像分析中,如果要对颜色进行筛选、HSV颜色空间是更好的选择。HSV颜色空间也是三通道,其含义分别是:
? ? ? ? 网上有个很有名的HSV颜色空间示意图,大伙儿看一下就明白了。
? ? ? ? HLS 也是由三通道组成,其含义分别是:
? ? ? ?HLS颜色空间示意图如下:
? ? ? ?注意哈:在提取白色物体时,使用 HLS 更方便,因为 HSV 中的Hue里没有白色,白色需要由S和V共同决定。而在 HLS 中,白色仅由亮度L一个分量决定(L=0)。
? ? ? ?总之,BGR、灰度图、HSV、HLS这四个,是最常用的颜色空间模型,其它的据说还有很多很多,读者可以有针对性的做做研究。
? ? ? ??Emgu.CV里面,使用CvtColor()函数对颜色空间进行转换,函数定义如下:
public static void CvtColor(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
ColorConversion code, // 颜色空间转换代码,表示从一种颜色空间转到到另一种颜色空间
int dstCn = 0 //目标图像的通道数,如果设置为0,会自动从源图像计算目标图像的通道数,一般可以不写;
)
? ? ? ??注意了,ColorConversion有144中,最常用的就是:
? ? ? ? 举个例子啊,把 以BGR的方式读取? lena.jpg,然后转换成HSV颜色空间,得到三个单通道图像,分别代表H通道、S通道、V通道,然后再将三个单通道图像合并,转换成BGR图片,代码如下:
Mat tempMat = srcMat.Clone();
Mat hsvMat = new Mat();
CvInvoke.CvtColor(tempMat, hsvMat, Emgu.CV.CvEnum.ColorConversion.Bgr2Hsv);
// 分离并显示各个通道
Mat[] channels = hsvMat.Split();
CvInvoke.Imshow("HSV H channel, " + channels[0].Size.ToString(), channels[0]);
CvInvoke.Imshow("HSV S channel, " + channels[1].Size.ToString(), channels[1]);
CvInvoke.Imshow("HSV V channel, " + channels[2].Size.ToString(), channels[2]);
// 再合并通道
// 创建一个空的标准Mat向量
VectorOfMat vChannels = new VectorOfMat();
// 依次往Mat向量里面加之前的三个通道,顺序不能变
vChannels.Push(channels[0]);
vChannels.Push(channels[1]);
vChannels.Push(channels[2]);
// 合并,然后再转回BGR颜色空间
CvInvoke.Merge(vChannels, dstMat);
CvInvoke.CvtColor(dstMat, dstMat, Emgu.CV.CvEnum.ColorConversion.Hsv2Bgr);
CvInvoke.Imshow("Merge result, " + dstMat.Size.ToString(), dstMat);
? ? ? ? ?代码执行效果如下:
?
? ? ? ? 上述代码中,需要注意通道合并函数?Merge()的使用方法。在Cv8u的图像深度下,灰度图、BGR、HSV、HLS的取值,都在[0,255]之间。有些文章单独介绍HSV、HLS时,取值范围可能会有些不同,这里要以Emgu.CV的为准。采用不同的颜色空间,目的就是为了对颜色进行筛选,下一篇会详细举例说明。
原创不易,请勿抄袭。共同进步,相互学习。