首页 文章

如何将图像转换为灰度?

提问于
浏览
3

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

每个像素:

  • 将RGB转换为HSL

  • ???

  • 将HSL转换回RGB

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

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

1 回答

  • 10

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

    我更新了这篇文章的更多细节 .

    平均值

    这是学生可以想象的第一件事就是转换成灰度(至少我过去想到的那样!),看起来像是去饱和:

    level = (R + G + B) / 3
    

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

    亮度

    第二种方法(Luminance有时被称为Luminosity,Luma或Intensity)是我们的眼睛感知亮度的更好的模型 . 它基于这样一个事实,即眼睛中的cone density在颜色上并不均匀 . 我们比蓝色更强烈地感知绿色比红色和红色更强烈 .
    因为我们不会产生看起来很自然的结果 . 如何管理?只需使用加权平均值:

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

    你可以想象有很多关于这些 Value 观的讨论 . 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之间的中点(亮度,你还记得_2651691中的一个颜色是3D空间中的一个点吗? ) . 获得去饱和图像的(简化)公式是:

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

    去除组成

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

    level = max(R, G, B);
    

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

    其他方法

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

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

相关问题