OpencvSharp 算子学习教案之 - Cv2.CvtColor大家好Opencv在很多工程项目中都会用到而OpencvSharp则是以C#开发与实现的Opencv操作库对.NET开发人员友好但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案供大家参考学习。Cv2.CvtColor教案版本V1.0面向对象OpenCvSharp 初学者所属模块imgproc源码位置OpenCvSharp/Cv2/Cv2_imgproc.cs:2450摘要Cv2.CvtColor是最常用的颜色空间转换函数。它可以在 BGR、GRAY、HSV、BGRA 等多种格式之间转换也可以通过dstCn影响输出通道数是理解图像通道变化的必学入口。1. 函数名称带参数签名publicstaticvoidCvtColor(InputArraysrc,OutputArraydst,ColorConversionCodescode,intdstCn0)2. 函数用途Cv2.CvtColor用来把图像从一种颜色空间转换到另一种颜色空间。它最常见的用途有把彩色图转成灰度图便于二值化、边缘检测和阈值处理。把 BGR 转成 HSV、YCrCb、Lab 等颜色空间方便做颜色分析。给图像补上 alpha 通道生成 BGRA 或 RGBA 图像。把单通道图再扩展成三通道图方便后续算法继续使用。3. 函数公式这个函数没有单一的数学公式因为不同code对应的是不同的颜色变换规则。更适合这样理解d s t T c o d e ( s r c , d s t C n ) dst T_{code}(src, dstCn)dstTcode(src,dstCn)其中T_{code}表示某一个具体的颜色转换规则。src是输入图像。dstCn用来控制输出通道数默认值0表示自动推导。对常见的几种转换可以这样记BGR2GRAY3 通道压成 1 通道。BGR2HSV3 通道变成另一套 3 通道表示。BGR2BGRA3 通道扩展成 4 通道。GRAY2BGR1 通道扩展成 3 通道。4. 函数原理说明CvtColor的工作方式可以分成三层理解先根据code判断输入输出的颜色空间关系。再根据输入图像的通道数和深度做对应的数值变换。最后按照目标格式写出结果。对初学者来说最重要的是记住下面这些规则src和dst的尺寸通常相同。输出深度通常和输入一致。输出通道数取决于code也可能受dstCn影响。如果你只是想“看见颜色变化”最常见的就是 BGR、GRAY、HSV 这几种组合。5. 参数含义解析参数名类型必填含义srcInputArray是输入图像dstOutputArray是输出图像codeColorConversionCodes是颜色转换代码dstCnint否目标通道数0表示自动推导补充说明src可以是 8 位、16 位或单精度浮点图像。dst的尺寸通常与src相同。dstCn 0时OpenCV 会根据code自动决定输出通道数。某些转换会改变通道数例如BGR2GRAY和GRAY2BGR。6. 应用场景列表场景名场景说明典型用途场景ABGR 转灰度把彩色图压缩成单通道图阈值、边缘、轮廓场景BBGR 转 HSV把颜色信息拆成色相、饱和度、明度颜色分割、颜色筛选场景CBGR 加 alpha给图像补上透明度通道UI 合成、透明图输出场景DGRAY 转 BGR把单通道图扩展成三通道兼容后续彩色算法7. 函数使用示例与 WPF 场景一一对应说明下面示例对应 WPF 页面里的CvtColor场景。为了让初学者更容易观察我们把 HSV 再拆成三个通道热力图单独查看。usingSystem;usingOpenCvSharp;internalstaticclassProgram{privatestaticvoidMain(){// 构造一张彩色教学图方便观察不同颜色空间的差异。usingvarsourceCreateColorDemoCard();// 常见的几种颜色转换灰度、HSV、BGRA以及灰度再转回 BGR。usingvargraynewMat();usingvarhsvnewMat();usingvarbgranewMat();usingvargrayToBgrnewMat();Cv2.CvtColor(source,gray,ColorConversionCodes.BGR2GRAY);Cv2.CvtColor(source,hsv,ColorConversionCodes.BGR2HSV);Cv2.CvtColor(source,bgra,ColorConversionCodes.BGR2BGRA);Cv2.CvtColor(gray,grayToBgr,ColorConversionCodes.GRAY2BGR);// 把 HSV 的三个通道拆开分别保存成热力图便于初学者观察每个通道的数值变化。varhsvChannelsCv2.Split(hsv);try{SaveHeatmap(hsvChannels[0],cvtcolor_h.png);SaveHeatmap(hsvChannels[1],cvtcolor_s.png);SaveHeatmap(hsvChannels[2],cvtcolor_v.png);}finally{foreach(varchannelinhsvChannels){channel.Dispose();}}// 保存所有结果方便对照查看。Cv2.ImWrite(cvtcolor_source.png,source);Cv2.ImWrite(cvtcolor_gray.png,gray);Cv2.ImWrite(cvtcolor_hsv_raw.png,hsv);Cv2.ImWrite(cvtcolor_bgra.png,bgra);Cv2.ImWrite(cvtcolor_gray_to_bgr.png,grayToBgr);Console.WriteLine(CvtColor 演示已完成。);}privatestaticMatCreateColorDemoCard(){// 这张图故意放几种不同颜色的几何图形便于观察颜色空间转换后的差异。varcanvasnewMat(240,360,MatType.CV_8UC3,newScalar(244,241,236));Cv2.Rectangle(canvas,newRect(20,26,108,78),newScalar(58,148,240),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(204,86),48,newScalar(76,220,126),-1,LineTypes.AntiAlias);Cv2.Ellipse(canvas,newPoint(274,172),newSize(66,42),-15,0,360,newScalar(220,108,78),-1,LineTypes.AntiAlias);Cv2.PutText(canvas,BGR,newPoint(144,220),HersheyFonts.HersheySimplex,0.95,newScalar(40,40,40),2,LineTypes.AntiAlias);returncanvas;}privatestaticvoidSaveHeatmap(MatsingleChannel,stringfileName){// 先把单通道数据映射到 0~255再套一层热力图方便肉眼观察数值分布。usingvarnormalizednewMat();singleChannel.ConvertTo(normalized,MatType.CV_8UC1);usingvarheatmapnewMat();Cv2.ApplyColorMap(normalized,heatmap,ColormapTypes.Turbo);Cv2.ImWrite(fileName,heatmap);}}8. 常见错误与避坑选错code例如把 BGR 图误当成 RGB 图处理。忘记dstCn 0的默认行为导致输出通道数和预期不同。想直接显示 HSV 原图但没有先把它转换回 BGR 或拆通道查看。把灰度图当成三通道图继续处理没有先做GRAY2BGR。误以为所有颜色空间转换都只是“换个名字”实际上很多转换会改变通道含义。9. 进阶扩展可以把CvtColor和InRange结合起来做颜色分割。可以先BGR2HSV再只取 H 通道做颜色筛选。可以结合Split/Merge单独处理某个颜色通道。可以把BGR2GRAY作为图像预处理步骤再接阈值、边缘和形态学操作。10. 小结Cv2.CvtColor是颜色空间转换的基础函数。只要记住三点就够了code决定转换方向和输出通道数。dstCn默认自动推导但必要时也可以显式指定。很多视觉算法都先从BGR2GRAY或BGR2HSV开始。11. 相关链接WPF 教学控件Cv2CvtColorControl.xaml.cs样例实现CvtColorSample.cs官方文档源码位置OpenCvSharp/Cv2/Cv2_imgproc.cs:2450
OpencvSharp 算子学习教案之 - Cv2.CvtColor
OpencvSharp 算子学习教案之 - Cv2.CvtColor大家好Opencv在很多工程项目中都会用到而OpencvSharp则是以C#开发与实现的Opencv操作库对.NET开发人员友好但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案供大家参考学习。Cv2.CvtColor教案版本V1.0面向对象OpenCvSharp 初学者所属模块imgproc源码位置OpenCvSharp/Cv2/Cv2_imgproc.cs:2450摘要Cv2.CvtColor是最常用的颜色空间转换函数。它可以在 BGR、GRAY、HSV、BGRA 等多种格式之间转换也可以通过dstCn影响输出通道数是理解图像通道变化的必学入口。1. 函数名称带参数签名publicstaticvoidCvtColor(InputArraysrc,OutputArraydst,ColorConversionCodescode,intdstCn0)2. 函数用途Cv2.CvtColor用来把图像从一种颜色空间转换到另一种颜色空间。它最常见的用途有把彩色图转成灰度图便于二值化、边缘检测和阈值处理。把 BGR 转成 HSV、YCrCb、Lab 等颜色空间方便做颜色分析。给图像补上 alpha 通道生成 BGRA 或 RGBA 图像。把单通道图再扩展成三通道图方便后续算法继续使用。3. 函数公式这个函数没有单一的数学公式因为不同code对应的是不同的颜色变换规则。更适合这样理解d s t T c o d e ( s r c , d s t C n ) dst T_{code}(src, dstCn)dstTcode(src,dstCn)其中T_{code}表示某一个具体的颜色转换规则。src是输入图像。dstCn用来控制输出通道数默认值0表示自动推导。对常见的几种转换可以这样记BGR2GRAY3 通道压成 1 通道。BGR2HSV3 通道变成另一套 3 通道表示。BGR2BGRA3 通道扩展成 4 通道。GRAY2BGR1 通道扩展成 3 通道。4. 函数原理说明CvtColor的工作方式可以分成三层理解先根据code判断输入输出的颜色空间关系。再根据输入图像的通道数和深度做对应的数值变换。最后按照目标格式写出结果。对初学者来说最重要的是记住下面这些规则src和dst的尺寸通常相同。输出深度通常和输入一致。输出通道数取决于code也可能受dstCn影响。如果你只是想“看见颜色变化”最常见的就是 BGR、GRAY、HSV 这几种组合。5. 参数含义解析参数名类型必填含义srcInputArray是输入图像dstOutputArray是输出图像codeColorConversionCodes是颜色转换代码dstCnint否目标通道数0表示自动推导补充说明src可以是 8 位、16 位或单精度浮点图像。dst的尺寸通常与src相同。dstCn 0时OpenCV 会根据code自动决定输出通道数。某些转换会改变通道数例如BGR2GRAY和GRAY2BGR。6. 应用场景列表场景名场景说明典型用途场景ABGR 转灰度把彩色图压缩成单通道图阈值、边缘、轮廓场景BBGR 转 HSV把颜色信息拆成色相、饱和度、明度颜色分割、颜色筛选场景CBGR 加 alpha给图像补上透明度通道UI 合成、透明图输出场景DGRAY 转 BGR把单通道图扩展成三通道兼容后续彩色算法7. 函数使用示例与 WPF 场景一一对应说明下面示例对应 WPF 页面里的CvtColor场景。为了让初学者更容易观察我们把 HSV 再拆成三个通道热力图单独查看。usingSystem;usingOpenCvSharp;internalstaticclassProgram{privatestaticvoidMain(){// 构造一张彩色教学图方便观察不同颜色空间的差异。usingvarsourceCreateColorDemoCard();// 常见的几种颜色转换灰度、HSV、BGRA以及灰度再转回 BGR。usingvargraynewMat();usingvarhsvnewMat();usingvarbgranewMat();usingvargrayToBgrnewMat();Cv2.CvtColor(source,gray,ColorConversionCodes.BGR2GRAY);Cv2.CvtColor(source,hsv,ColorConversionCodes.BGR2HSV);Cv2.CvtColor(source,bgra,ColorConversionCodes.BGR2BGRA);Cv2.CvtColor(gray,grayToBgr,ColorConversionCodes.GRAY2BGR);// 把 HSV 的三个通道拆开分别保存成热力图便于初学者观察每个通道的数值变化。varhsvChannelsCv2.Split(hsv);try{SaveHeatmap(hsvChannels[0],cvtcolor_h.png);SaveHeatmap(hsvChannels[1],cvtcolor_s.png);SaveHeatmap(hsvChannels[2],cvtcolor_v.png);}finally{foreach(varchannelinhsvChannels){channel.Dispose();}}// 保存所有结果方便对照查看。Cv2.ImWrite(cvtcolor_source.png,source);Cv2.ImWrite(cvtcolor_gray.png,gray);Cv2.ImWrite(cvtcolor_hsv_raw.png,hsv);Cv2.ImWrite(cvtcolor_bgra.png,bgra);Cv2.ImWrite(cvtcolor_gray_to_bgr.png,grayToBgr);Console.WriteLine(CvtColor 演示已完成。);}privatestaticMatCreateColorDemoCard(){// 这张图故意放几种不同颜色的几何图形便于观察颜色空间转换后的差异。varcanvasnewMat(240,360,MatType.CV_8UC3,newScalar(244,241,236));Cv2.Rectangle(canvas,newRect(20,26,108,78),newScalar(58,148,240),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(204,86),48,newScalar(76,220,126),-1,LineTypes.AntiAlias);Cv2.Ellipse(canvas,newPoint(274,172),newSize(66,42),-15,0,360,newScalar(220,108,78),-1,LineTypes.AntiAlias);Cv2.PutText(canvas,BGR,newPoint(144,220),HersheyFonts.HersheySimplex,0.95,newScalar(40,40,40),2,LineTypes.AntiAlias);returncanvas;}privatestaticvoidSaveHeatmap(MatsingleChannel,stringfileName){// 先把单通道数据映射到 0~255再套一层热力图方便肉眼观察数值分布。usingvarnormalizednewMat();singleChannel.ConvertTo(normalized,MatType.CV_8UC1);usingvarheatmapnewMat();Cv2.ApplyColorMap(normalized,heatmap,ColormapTypes.Turbo);Cv2.ImWrite(fileName,heatmap);}}8. 常见错误与避坑选错code例如把 BGR 图误当成 RGB 图处理。忘记dstCn 0的默认行为导致输出通道数和预期不同。想直接显示 HSV 原图但没有先把它转换回 BGR 或拆通道查看。把灰度图当成三通道图继续处理没有先做GRAY2BGR。误以为所有颜色空间转换都只是“换个名字”实际上很多转换会改变通道含义。9. 进阶扩展可以把CvtColor和InRange结合起来做颜色分割。可以先BGR2HSV再只取 H 通道做颜色筛选。可以结合Split/Merge单独处理某个颜色通道。可以把BGR2GRAY作为图像预处理步骤再接阈值、边缘和形态学操作。10. 小结Cv2.CvtColor是颜色空间转换的基础函数。只要记住三点就够了code决定转换方向和输出通道数。dstCn默认自动推导但必要时也可以显式指定。很多视觉算法都先从BGR2GRAY或BGR2HSV开始。11. 相关链接WPF 教学控件Cv2CvtColorControl.xaml.cs样例实现CvtColorSample.cs官方文档源码位置OpenCvSharp/Cv2/Cv2_imgproc.cs:2450