C# + OpenCVSharp 实现图像颜色分割

515 阅读3分钟

前言

计算机视觉领域,颜色分割是识别和提取图像中特定颜色区域的基础技术,广泛应用于目标检测(如工业零件分拣)、医学图像分析(如病变区域标记)和自动驾驶(如车道线识别)等场景。

传统方法依赖复杂的像素遍历与条件判断,效率低且代码冗余。

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

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!