Monotouch iOS识别图片中的颜色?

时间:2013-07-17 19:03:02

标签: c# image-processing

我不知道Monotouch是否可以这样做,所以我想我会问专家。假设我希望能够拍摄一幅彩绘墙的照片,并从中识别出它的一般颜色 - 我将如何在C#/ Monotouch中实现这一目标?

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

另外,我不需要知道确切的颜色,我只需要知道一般的颜色系列。我不需要知道墙是皇家蓝,我只需要它返回“蓝色”。我不需要知道猎人绿色,我只需要它返回“绿色”。我从未用图像处理这样做过。

2 个答案:

答案 0 :(得分:2)

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

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

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;
  }
}         

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

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

Color wheel

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

答案 1 :(得分:1)

我最近处理过在iOS上转换白平衡问题(这里的原始问题:iOS White point/white balance adjustment examples/suggestions),其中包含类似的问题。 我不能在C#中给你代码示例,但这是我要采取的步骤:

  1. 捕捉图像
  2. 确定感兴趣的图像的哪个点/部分(越小越好)
  3. 计算图像中该点的“颜色”
  4. 将“颜色”转换为人类可读的形式(我想这就是你需要的?)
  5. 要完成步骤2,我要么让用户选择点,要么让点位于图像的中心,因为这通常是相机实际指向的位置。

    如何同步步骤#3取决于步骤#2中选择的区域有多大。如果该区域为1x1像素,则以RGB格式渲染该区域,并从该渲染像素中获取组件(即红绿色和蓝色)值。如果区域较大,则需要获取该区域中包含的每个像素的RGB值并对其求平均值。 如果你只需要一般的颜色,这将主要是它。但如果你需要补偿光照条件,问题会变得非常复杂。为了补偿光照(即白平衡),你需要进行一些转换和一些猜测照片的拍摄条件。我不会详细介绍(我在这些细节上写了我的Bachelors论文)但是维基百科上有关White Balance的文章是一个很好的起点。 值得注意的是,白平衡问题的解决方案总是主观的,并且取决于拍摄照片的假设(至少据我所知)。

    要完成步骤#4,您应该搜索将RGB值映射到人类可读颜色的表格。我没有这种桌子的需要,但我确信它们存在于互联网上。