前言
计算机视觉领域,颜色分割是识别和提取图像中特定颜色区域的基础技术,广泛应用于目标检测(如工业零件分拣)、医学图像分析(如病变区域标记)和自动驾驶(如车道线识别)等场景。
传统方法依赖复杂的像素遍历与条件判断,效率低且代码冗余。
OpenCVSharp作为OpenCV的.NET封装库,为C#开发提供了高性能的图像处理接口。通过结合OpenCV的算法能力与C#的语法简洁性,可以快速实现精准的颜色分割。
本文将以实际案例解析颜色分割的核心步骤,并提供可直接复用的代码示例。
正文
1、环境准备与项目配置
安装OpenCVSharp
通过NuGet包管理器安装OpenCvSharp4和OpenCvSharp4.runtime.win(根据系统选择运行时包)。
Install-Package OpenCvSharp4
2、颜色分割实现步骤
2.1、加载图像并转换颜色空间
关键点:颜色分割通常在HSV/Lab空间进行(相比RGB更易区分颜色)。
// 读取图像
Mat image = Cv2.ImRead("input.jpg", ImreadModes.Color);
// 转换为HSV颜色空间
Mat hsvImage = new Mat();
Cv2.CvtColor(image, hsvImage, ColorConversionCodes.BGR2HSV);
2.2、定义目标颜色范围
原理:通过设定HSV的上下阈值,提取特定颜色区域(如红色、蓝色)。
// 示例:提取红色区域(需根据实际场景调整阈值)
Scalar lowerRed = new Scalar(0, 70, 50); // HSV最小值(H: 0-10)
Scalar upperRed = new Scalar(10, 255, 255); // HSV最大值
// 创建二值化掩膜(Mask)
Mat mask = new Mat();
Cv2.InRange(hsvImage, lowerRed, upperRed, mask);
2.3、优化分割结果
形态学操作:通过腐蚀(Erode)和膨胀(Dilate)去除噪声。
// 定义核(Kernel)
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5));
// 开运算:先腐蚀后膨胀
Cv2.MorphologyEx(mask, mask, MorphTypes.Open, kernel);
2.4、提取目标区域轮廓
// 查找轮廓
Cv2.FindContours(mask, out Point[][] contours, out HierarchyIndex[] hierarchy,
RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 在原图上绘制轮廓
Cv2.DrawContours(image, contours, -1, Scalar.Red, 2);
3、完整示例代码
using System;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using OpenCvSharp.XFeatures2D;
using static OpenCvSharp.Cv2;
namespace Mycv
{
public class cvGO
{
public float Color_Inrange(Bitmap srcbmp, out Bitmap dstbmp, int[] value_Low, int[] value_High)
{
using (Mat src = BitmapConverter.ToMat(srcbmp))
using (Mat dst = new Mat())
{
Scalar cvL = new Scalar(value_Low[0], value_Low[1], value_Low[2]);
Scalar cvH = new Scalar(value_High[0], value_High[1], value_High[2]);
InRange(src, cvL, cvH, dst);
dstbmp = dst.ToBitmap();
return (CountNonZero(dst) / (src.Width * src.Height * 1.0f) * 100);
}
}
}
}
4、效果
效果展示与参数调优
总结
OpenCVSharp为C#开发提供了与OpenCV原生库接近的性能和灵活性,使得颜色分割任务从繁琐的底层编码中解放。
通过本文的代码可快速实现:
工业检测中的缺陷区域标记
自然场景下的特定物体识别(如交通标志)
医学图像中的病灶分析
希望通过本文能为 .NET 视觉开发方面提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:Fxxk_Csdn
出处:blog.csdn.net/qq_39930578/article/details/85286382
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!