如何将图像转换为灰度?

时间:2012-03-23 12:14:58

标签: android image-processing rgb hsl

我想通过代码(android)完全像上面的图像。但我对这个算法感到困惑。我所知道的是:

每个像素:

  1. 将RGB转换为HSL

  2. ???

  3. 将HSL转换回RGB

  4. 任何人都可以向我解释在步骤2中该怎么做?非常感谢。

    ps:我可以通过ColorMatrix.setSaturation(0)在android中设置饱和度,但结果图像与Photoshop不一样(因为Hue和Lightness没有改变?)

1 个答案:

答案 0 :(得分:10)

您有很多选择去饱和图像。 此外请注意,使图像饱和度只是为了使其成为B& W但是对于某些应用程序,您可能认为它们是等效的。

我更新了这篇文章的详细信息。

平均

level = (R + G + B) / 3

它不会产生不良结果,它实现快速且容易。但它有一个很大的缺点,就是它与人类感知光度的方式不符。

亮度

第二种方法(亮度有时被称为亮度,亮度或强度)是我们的眼睛感知亮度的更好的模型。它基于以下事实:眼睛中的cone density在颜色上不均匀。我们比蓝色更强烈地感知绿色比红色和红色更强烈 因为我们没有感知到具有相同强度的所有颜色,所以平均方法是不准确的(至少它不会产生看起来自然的结果)。如何管理?只需使用加权平均值:

level = R * 0.3 + G * 0.59 + B * 0.11

您可以想象有很多关于这些价值观的讨论。 ITU-R的原始建议提出了这个公式:

level = R * 0.2126 + G * 0.7152 + B * 0.0722

如果我没错,那么Photoshop会使用这个简单的去饱和功能(是的,它是第一个的未连接版本):

level = R * 0.299 + G * 0.587 + B * 0.114

我不认为我们最近可能会注意到很多不同的更改,请查看here on Wikipedia了解有关此公式的详细信息。

您想了解更多详情吗?阅读Charles Poynton的这篇文章:The rehabilitation of gamma和他的FAQ关于这个话题。

去饱和

您使用RGB color model描述每个像素,但饱和度属于HSL color model(实际上,当工作饱和时,您可以同时使用HSL或HSV模型)。有关这些型号的详细信息,请阅读链接。

对图像进行去饱和处理包括以下步骤:

  • 将每个像素从RGB转换为HSL(如果需要详细信息,请参阅this article。)
  • 强制将饱和度强制为零(这应该是setSaturation(0)所做的)
  • 将其转换回RGB(请参阅此bookmark)。

让我在这个过程中介绍简化:你可以去寻找一个颜色,找到最大RGB和最小RGB之间的中点(亮度,你还记得那个颜色,在RGB color space,是3D空间中的一个点?)。获得去饱和图像的(简化)公式是:

level = (max(R, G, B) + min(R, G, B)) / 2

德组合物

一种更简单的去饱和形式,有时称为局部最大分解,只需选择每个RGB三元组的最大值:

level = max(R, G, B);

你可以想象你可以使用局部最大值或局部最小值(我写了 local ,因为它搜索每个像素的最小值/最大值)。

其他方法

不要忘记你可以以非常快的方式获得一个B& W图像(然后看起来像一个不饱和图像的东西),只需保留RGB三元组中的一个单一通道(例如绿色通道)并复制该值到所有渠道)。

有时Photoshops教程不使用其功能去饱和图像(去饱和度函数和调整调色板),但为了获得更好的效果,他们添加了一个颜色均匀的图层(使用 Luminance 部分的值计算)然后他们将该图层与原始图像合并(搜索代码中的步骤教程和重新编辑)。