如何在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
相关产品推荐
相关产品推荐

