You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取图像特定区域颜色及确定精准裁剪位置

自动定位目标颜色区域并精准裁剪的解决方案

我完全懂你的困扰——手动硬编码坐标裁剪太死板,结果还不准。咱们换个思路:通过自动识别目标颜色的像素范围,算出它的最小外接矩形,再用这个矩形精准裁剪,就能拿到准确的平均颜色了。下面是具体的实现思路和代码:


核心步骤拆解

1. 先给目标红色定个范围

红色在RGB空间里有深浅差异,咱们得先设定一个合理的阈值,用来判断某个像素是不是咱们要找的红色。举个例子:

  • 红色通道(R)值偏高(比如>200)
  • 绿色通道(G)和蓝色通道(B)值偏低(比如<80)
    你可以根据实际的红色色调灵活调整这些数值。

2. 遍历图像标记目标像素

把整个图像的每个像素过一遍,检查是否符合咱们设定的红色范围,把符合条件的像素坐标都记下来。

3. 算出目标区域的最小外接矩形

从所有标记的像素里,找出最左、最右、最上、最下的坐标,这四个值就能圈出包围所有目标像素的最小矩形——这就是咱们要的精准裁剪区域。

4. 裁剪+计算平均颜色

用这个矩形裁剪图像,再调用你已经写好的GetRGBvalueCroppedImage方法计算平均颜色就行。


具体代码实现

下面是可以直接整合到你项目里的C#代码:

// 判断某个像素是否属于目标红色的方法
private bool IsTargetRed(Color pixelColor)
{
    // 这里的阈值可以根据你实际的红色调整,比如偏暗的红色可以降低R的阈值
    return pixelColor.R > 200 && pixelColor.G < 80 && pixelColor.B < 80;
}

// 获取目标红色区域的最小外接矩形
private Rectangle? GetTargetColorBoundingBox(Image originalImage)
{
    Bitmap bm = new Bitmap(originalImage);
    int minX = int.MaxValue;
    int maxX = int.MinValue;
    int minY = int.MaxValue;
    int maxY = int.MinValue;
    bool foundTarget = false;

    for (int y = 0; y < bm.Height; y++)
    {
        for (int x = 0; x < bm.Width; x++)
        {
            Color pixel = bm.GetPixel(x, y);
            if (IsTargetRed(pixel))
            {
                foundTarget = true;
                // 更新边界坐标
                if (x < minX) minX = x;
                if (x > maxX) maxX = x;
                if (y < minY) minY = y;
                if (y > maxY) maxY = y;
            }
        }
    }

    if (!foundTarget)
    {
        // 没找到目标红色区域,返回null
        return null;
    }

    // 计算矩形宽高(坐标从0开始,要+1才是实际尺寸)
    int width = maxX - minX + 1;
    int height = maxY - minY + 1;
    return new Rectangle(minX, minY, width, height);
}

// 主方法:获取目标红色区域的平均颜色
private RgbDto GetTargetRedAreaAvgColor(Image originalImage)
{
    Rectangle? targetRect = GetTargetColorBoundingBox(originalImage);
    if (targetRect == null)
    {
        // 处理未找到红色区域的情况,比如返回默认值或抛出异常
        return new RgbDto();
    }

    // 裁剪目标区域
    Bitmap originalBm = new Bitmap(originalImage);
    Bitmap croppedBm = originalBm.Clone(targetRect.Value, originalBm.PixelFormat);
    
    // 调用你已有的方法计算平均颜色
    return GetRGBvalueCroppedImage(croppedBm);
}

小提示

  • 阈值微调:如果识别的红色区域不准,就去改IsTargetRed里的RGB数值,比如偏亮的红色可以提高G/B的上限。
  • 性能优化:如果图像很大,GetPixel会有点慢,你可以改用你原代码里的LockBits方式遍历像素,速度会快很多。
  • 边缘处理:一定要处理没找到红色区域的情况,避免空引用报错。

内容的提问来源于stack exchange,提问作者H.Neo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:57:09