C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# OpenCVSharp颜色空间转换

C# OpenCVSharp实现颜色空间转换功能

作者:墨夶

OpenCVSharp 是 OpenCV 的 C# 封装,允许开发者在 .NET 环境下使用 OpenCV 提供的强大计算机视觉和图像处理功能,它支持大多数 OpenCV 的功能,包括图像读取、处理、特征检测、机器学习等,所以本文给大家介绍了C# OpenCVSharp实现颜色空间转换功能,需要的朋友可以参考下

一、颜色空间转换的“生死劫”:为什么RGB到HSV是图像处理的“必杀技”?

痛点直击

真实案例

二、第1步:OpenCVSharp基础环境搭建

核心目标:快速上手OpenCVSharp 4.6+,配置项目依赖!

1. NuGet包安装

# 使用NuGet安装OpenCVSharp4和OpenCVSharp4.runtime.win
Install-Package OpenCVSharp4 -Version 4.6.0.20240520
Install-Package OpenCVSharp4.runtime.win -Version 4.6.0.20240520

2. C#项目配置

using OpenCvSharp;
using System;

namespace ColorSpaceConversionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 示例入口
            Console.WriteLine("OpenCVSharp颜色空间转换演示启动!");
            ConvertRGBToHSV("input.jpg");
        }

        static void ConvertRGBToHSV(string imagePath)
        {
            // 读取图像
            Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
            if (src.Empty)
            {
                Console.WriteLine("无法加载图像,请检查路径!");
                return;
            }

            // 转换为HSV
            Mat hsv = new Mat();
            Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);

            // 显示结果
            Cv2.ImShow("原始RGB图像", src);
            Cv2.ImShow("转换后的HSV图像", hsv);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

陷阱规避

三、第2步:RGB到HSV的“魔法公式”解析

核心目标:理解HSV颜色空间的数学原理与OpenCVSharp的实现细节!

1. HSV颜色空间定义

2. OpenCVSharp的HSV转换原理

BGR2HSV转换公式

// OpenCV内部算法(简化版)
// 1. 归一化BGR值到[0,1]
// 2. 计算最大值max和最小值min
// 3. H = 60 * ((max - R)/delta % 6) (需调整通道顺序)
// 4. S = delta / max * 255
// 5. V = max * 255

3. 自定义HSV转换代码

static Mat ConvertToHSV(Mat src)
{
    Mat hsv = new Mat(src.Size(), MatType.CV_8UC3);
    for (int y = 0; y < src.Height; y++)
    {
        for (int x = 0; x < src.Width; x++)
        {
            Vec3b pixel = src.Get<Vec3b>(y, x);
            byte b = pixel.Item0;
            byte g = pixel.Item1;
            byte r = pixel.Item2;

            double max = Math.Max(r, Math.Max(g, b));
            double min = Math.Min(r, Math.Min(g, b));
            double delta = max - min;

            byte h = 0, s = 0, v = (byte)(max / 255.0 * 255);

            if (delta != 0)
            {
                double hTemp = 0;
                if (max == r)
                    hTemp = (g - b) / delta;
                else if (max == g)
                    hTemp = 2 + (b - r) / delta;
                else if (max == b)
                    hTemp = 4 + (r - g) / delta;
                hTemp *= 60;
                if (hTemp < 0)
                    hTemp += 360;
                h = (byte)(hTemp / 2); // OpenCV范围0-179
            }

            s = (byte)(delta / max * 255);
            hsv.Set(y, x, new Vec3b(h, s, v));
        }
    }
    return hsv;
}

实战建议

四、第3步:HSV颜色过滤——“精准捕捉”特定颜色

核心目标:通过HSV阈值提取指定颜色的物体!

1. 定义颜色范围

// 示例:蓝色范围(根据实际需求调整)
Scalar lowerBlue = new Scalar(100, 150, 50);
Scalar upperBlue = new Scalar(140, 255, 255);

2. 创建掩码并提取颜色

static void FilterColor(string imagePath)
{
    Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
    Mat hsv = new Mat();
    Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);

    // 定义颜色范围
    Scalar lower = new Scalar(100, 150, 50);
    Scalar upper = new Scalar(140, 255, 255);

    // 创建掩码
    Mat mask = new Mat();
    Cv2.InRange(hsv, lower, upper, mask);

    // 位运算提取目标
    Mat result = new Mat();
    Cv2.BitwiseAnd(src, src, result, mask);

    // 显示结果
    Cv2.ImShow("原始图像", src);
    Cv2.ImShow("掩码", mask);
    Cv2.ImShow("提取结果", result);
    Cv2.WaitKey(0);
}

陷阱规避

五、第4步:高级应用——颜色直方图均衡化

核心目标:通过HSV增强图像对比度,提升识别效果!

1. HSV通道分离

static void EqualizeHSV(string imagePath)
{
    Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
    Mat hsv = new Mat();
    Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);

    // 分离通道
    Mat[] channels = new Mat[3];
    Cv2.Split(hsv, channels); // [H, S, V]

    // 均衡化V通道(明度)
    Cv2.EqualizeHist(channels[2], channels[2]);

    // 合并通道
    Mat enhancedHsv = new Mat();
    Cv2.Merge(channels, enhancedHsv);

    // 转换回BGR
    Mat enhancedBgr = new Mat();
    Cv2.CvtColor(enhancedHsv, enhancedBgr, ColorConversionCodes.HSV2BGR);

    // 显示结果
    Cv2.ImShow("原始图像", src);
    Cv2.ImShow("增强后图像", enhancedBgr);
    Cv2.WaitKey(0);
}

实战建议

六、第5步:性能优化——“榨干”OpenCVSharp的极限

核心目标:通过并行计算和内存优化提升转换效率!

1. 并行处理图像

static Mat ParallelConvertToHSV(Mat src)
{
    Mat hsv = new Mat(src.Size(), MatType.CV_8UC3);
    Parallel.For(0, src.Height, y =>
    {
        for (int x = 0; x < src.Width; x++)
        {
            Vec3b pixel = src.Get<Vec3b>(y, x);
            byte b = pixel.Item0;
            byte g = pixel.Item1;
            byte r = pixel.Item2;

            double max = Math.Max(r, Math.Max(g, b));
            double min = Math.Min(r, Math.Min(g, b));
            double delta = max - min;

            byte h = 0, s = 0, v = (byte)(max / 255.0 * 255);

            if (delta != 0)
            {
                double hTemp = 0;
                if (max == r)
                    hTemp = (g - b) / delta;
                else if (max == g)
                    hTemp = 2 + (b - r) / delta;
                else if (max == b)
                    hTemp = 4 + (r - g) / delta;
                hTemp *= 60;
                if (hTemp < 0)
                    hTemp += 360;
                h = (byte)(hTemp / 2); // OpenCV范围0-179
            }

            s = (byte)(delta / max * 255);
            hsv.Set(y, x, new Vec3b(h, s, v));
        }
    });
    return hsv;
}

陷阱规避

七、 颜色空间转换的“黄金组合拳”

方案优点缺点适用场景
RGB→HSV颜色过滤精准,算法高效需要手动调整阈值颜色识别、物体追踪
HSV→BGR保留颜色信息,便于后续处理可能引入噪声图像增强、色彩校正
HSV均衡化提升明度对比度,增强视觉效果色相可能失真图像预处理、低光增强
并行处理大幅提升计算速度实现复杂,需注意线程安全高并发图像处理系统

八、终极优化:颜色空间转换的“黑科技”

1. 动态阈值调整工具

// 使用Trackbar实时调整HSV阈值
static void InteractiveFilter(string imagePath)
{
    Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
    Mat hsv = new Mat();
    Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);

    // 创建Trackbar
    Cv2.NamedWindow("HSV Thresholding");
    int hLow = 100, hHigh = 140;
    int sLow = 150, sHigh = 255;
    int vLow = 50, vHigh = 255;

    Cv2.CreateTrackbar("H Low", "HSV Thresholding", ref hLow, 179);
    Cv2.CreateTrackbar("H High", "HSV Thresholding", ref hHigh, 179);
    Cv2.CreateTrackbar("S Low", "HSV Thresholding", ref sLow, 255);
    Cv2.CreateTrackbar("S High", "HSV Thresholding", ref sHigh, 255);
    Cv2.CreateTrackbar("V Low", "HSV Thresholding", ref vLow, 255);
    Cv2.CreateTrackbar("V High", "HSV Thresholding", ref vHigh, 255);

    while (true)
    {
        Scalar lower = new Scalar(hLow, sLow, vLow);
        Scalar upper = new Scalar(hHigh, sHigh, vHigh);

        Mat mask = new Mat();
        Cv2.InRange(hsv, lower, upper, mask);
        Mat result = new Mat();
        Cv2.BitwiseAnd(src, src, result, mask);

        Cv2.ImShow("Result", result);
        if (Cv2.WaitKey(1) == 27) break; // 按Esc退出
    }
}

实战建议

** 颜色空间转换不是“技术难题”,而是“视觉艺术”!**

终极奥义

以上就是C# OpenCVSharp实现颜色空间转换功能的详细内容,更多关于C# OpenCVSharp颜色空间转换的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文