【Emgu.CV教程】第19篇 、色彩处理之颜色空间转换

        前面介绍过了灰度图,在这种颜色空间下,像素值代表像素的亮度信息,取值范围为[0,255]。在图像处理领域,除了灰度图,常用的颜色空间还有以下几种:

1、BGR颜色空间

        由蓝( Blue )、绿( Green )、红( Red )三个通道组成。每个通道的值范围是[0,255] ,代表了颜色的强度。BGR颜色空间也是Emgu.CV默认打开图片的颜色空间格式。这里要注意三个颜色通道的顺序,和我们常见的RGB是反的。

        这种颜色空间,最适用于图像显示,但是对于图像分析,往往不太合适。

2、HSV颜色空间

        在图像分析中,如果要对颜色进行筛选、HSV颜色空间是更好的选择。HSV颜色空间也是三通道,其含义分别是:

【Emgu.CV教程】第19篇 、色彩处理之颜色空间转换_第1张图片

  • Hue(色调、色相)
  • Saturation(饱和度、色彩纯净度)
  • Value(明度)

        网上有个很有名的HSV颜色空间示意图,大伙儿看一下就明白了。

3、HLS颜色空间

        HLS 也是由三通道组成,其含义分别是:

  • Hue(色相)
  • Lightness(亮度)
  • Saturation(饱和度)

       HLS颜色空间示意图如下:

【Emgu.CV教程】第19篇 、色彩处理之颜色空间转换_第2张图片

       注意哈:在提取白色物体时,使用 HLS 更方便,因为 HSV 中的Hue里没有白色,白色需要由S和V共同决定。而在 HLS 中,白色仅由亮度L一个分量决定(L=0)。

       总之,BGR、灰度图、HSV、HLS这四个,是最常用的颜色空间模型,其它的据说还有很多很多,读者可以有针对性的做做研究。

4、CvtColor()函数转换颜色空间

        Emgu.CV里面,使用CvtColor()函数对颜色空间进行转换,函数定义如下:

public static void CvtColor(
    IInputArray src,  // 输入图像
    IOutputArray dst, // 输出图像
    ColorConversion code, // 颜色空间转换代码,表示从一种颜色空间转到到另一种颜色空间
    int dstCn = 0 //目标图像的通道数,如果设置为0,会自动从源图像计算目标图像的通道数,一般可以不写;
)

        注意了,ColorConversion有144中,最常用的就是:

  • Bgr2Gray,BGR颜色空间转灰度图
  • Bgr2Hsv,BGR颜色空间转HSV
  • Bgr2Hls,BGR颜色空间转HLS

        举个例子啊,把 以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的为准。采用不同的颜色空间,目的就是为了对颜色进行筛选,下一篇会详细举例说明。

原创不易,请勿抄袭。共同进步,相互学习。

你可能感兴趣的:(Emgu.CV使用教程,计算机视觉,c#,图像处理,Emgu.CV)