1

我不知道 Monotouch 是否可以做到这一点,所以我想我会问专家。假设我希望能够拍一张粉刷过的墙壁的照片并从中识别出一般颜色 - 我将如何在 C#/Monotouch 中做到这一点?

我知道我需要捕获图像并进行一些图像处理,但我对它的动态更加好奇。我需要担心照明条件吗?我认为闪光灯会“洗掉”我的形象,对吧?

另外,我不需要知道确切的颜色,我只需要知道一般的颜色系列。我不需要知道一堵墙是宝蓝色,我只需要它返回“蓝色”。我不需要知道猎人绿色,我只需要它返回“绿色”。我从来没有用图像处理做过。

4

2 回答 2

2

下面的代码依赖于 .NET System.Drawing.Bitmap类和System.Drawing.Color类,但我相信 MonoTouch 都支持这些(至少基于我对Mono 文档的阅读)。

因此,假设您在名为bmp的System.Drawing.Bitmap对象中有一个图像。您可以使用如下代码获得该图像的平均色调:

float hue = 0;
int w = bmp.Width;
int h = bmp.Height;               
for (int y = 0; y < bmp.Height; y++) {
  for (int x = 0; x < bmp.Width; x++) {
    Color c = bmp.GetPixel(x, y);
    hue += c.GetHue();
  }
}
hue /= (bmp.Width*bmp.Height);

这是对整个图像的迭代,对于大图像来说可能会很慢。如果性能是一个问题,您可能希望将评估的像素限制为图像的较小部分(如juhan_h建议的那样),或者只使用较小的图像开始。

然后给定平均色调,在 0 到 360 度的范围内,您可以将该数字映射到颜色名称,如下所示:

String[] hueNames = new String[] {
  "red","orange","yellow","green","cyan","blue","purple","pink"
};
float[] hueValues = new float[] {
  18, 54, 72, 150, 204, 264, 294, 336
};                            

String hueName = hueNames[0];
for (int i = 0; i < hueNames.Length; i++) {
  if (hue < hueValues[i]) {
    hueName = hueNames[i];
    break;
  }
}         

我刚刚估计了hueValueshueNames表的一些值,因此您可能需要调整这些表以满足您的要求。这些值是颜色似乎变为下一个名称的点(例如,红色和橙色之间的分界线出现在大约 18 度处)。

要了解色调值所代表的颜色范围,请查看下面的色轮。从顶部开始,它从红色/橙色(约 0° - 北)到黄色/绿色(约 90° - 东),再到青色(约 180° - 南),再到蓝色/紫色(约 270° - 西) .

色轮

但是,您应该注意,我们忽略了饱和度和亮度级别,因此在褪色和低光照条件下,此计算的结果将不太理想。但是,如果您只对墙壁的一般颜色感兴趣,我认为它可能足以满足您的需求。

于 2013-07-25T18:48:54.650 回答
1

我最近处理了 iOS 上的白平衡转换问题(此处的原始问题:iOS 白点/白平衡调整示例/建议),其中包括类似的问题。我无法为您提供 C# 中的代码示例,但以下是我将采取的步骤:

  1. 捕捉图像
  2. 确定图像的哪些点/部分是感兴趣的(越小越好)
  3. 计算图像该点的“颜色”
  4. 将“颜色”转换为人类可读的形式(我想这就是你需要的?)

为了完成第 2 步,我要么让用户选择该点,要么让该点位于图像的中心,因为这通常是相机实际指向的位置。

如何完成第 3 步取决于第 2 步中选择的区域有多大。如果该区域是 1x1 像素,那么您将其渲染为 RGB 并从该渲染像素中获取组件(即红绿和蓝色)值。如果该区域较大,那么您需要获取该区域中包含的每个像素的 RGB 值并将它们平均。如果您只需要一般颜色,这主要是它。但是,如果您需要补偿照明条件,问题就会变得非常复杂。为了补偿照明(即白平衡),您需要进行一些转换并猜测照片拍摄的条件。我不会详细介绍(我就这些细节写了我的学士论文),但维基百科关于白平衡的文章是一个很好的起点。还值得注意的是,白平衡问题的解决方案始终是主观的,并且取决于拍摄照片的光线的猜测(至少据我所知)。

要完成第 4 步,您应该搜索将 RGB 值映射到人类可读颜色的表。我不需要这些表格,但我确信它们存在于 Internet 上的某个地方。

于 2013-07-24T07:51:28.740 回答