如何将图像转换为灰度?

2024-01-14

我想通过代码(android)做与上图完全相同的事情。但我对执行此操作的算法感到困惑。我所知道的是:

对于每个像素:

  1. 将 RGB 转换为 HSL

  2. ???

  3. 将 HSL 转换回 RGB

谁能帮我解释一下第 2 步要做什么?非常感谢。

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


您有多种选项可以降低图像的饱和度。 此外请注意,对图像进行去饱和处理not只是为了使其黑白,但对于某些应用程序,您可能认为它们是等效的。

我更新了这篇文章并提供了更多详细信息。

Average

这是第一件事student可以将图像转换为灰度(至少是我过去首先想到的!),它看起来像去饱和度:

level = (R + G + B) / 3

它不会产生不好的结果,而且快速且易于实施。但它有一个很大的缺点,那就是它与人类感知光度的方式不相符。

亮度

第二种方法(亮度有时称为亮度、亮度或强度)是我们眼睛感知亮度方式的更好模型。这是基于以下事实:锥体密度 http://hyperphysics.phy-astr.gsu.edu/hbase/vision/rodcone.html不同颜色在眼睛中的表现并不统一。我们对绿色的感知比对红色的感知更强烈,对红色的感知比对蓝色的感知更强烈。
因为我们不会以相同的强度感知所有颜色,所以平均方法是不准确的(至少它不会产生看起来像的结果)natural)。如何管理这个?只需使用加权平均值:

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

正如您可以想象的那样,关于这些价值观有很多讨论。最初的 ITU-R 建议书提出了这个公式:

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

如果我没记错的话 Photoshop 使用这个simple去饱和函数(是的,它是第一个函数的未舍入版本):

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

我不认为我们可能会注意到很多差异,无论如何推荐最近发生了变化,看看维基百科上的这里 http://en.wikipedia.org/wiki/Luma_%28video%29有关此公式的更多详细信息。

您想要更多详细信息吗?阅读查尔斯·波因顿的这篇文章:伽马康复 http://poynton.com/papers/IST_SPIE_9801/index.html和他的FAQ http://poynton.com/GammaFAQ.html关于这个话题。

去饱和度

每个像素都用RGB颜色模型 http://en.wikipedia.org/wiki/RGB_color_model但饱和度属于HSL颜色模型 http://en.wikipedia.org/wiki/HSL_and_HSV(实际上,当您可以使用 HSL 或 HSV 模型时working饱和)。请阅读链接以了解有关这些型号的更多详细信息。

图像去饱和包括以下步骤:

  • 将每个像素从 RGB 转换为 HSL(请参阅如果您需要详细信息)。
  • 强制饱和度为零(这应该是setSaturation(0) does)
  • 将其转换回 RGB(参见此bookmark http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB).

让我介绍一个big这个过程的简化:你可以对颜色进行去饱和,找到 RGB 最大值和 RGB 最小值之间的中点(亮度,你还记得颜色中的颜色吗?RGB色彩空间 http://en.wikipedia.org/wiki/RGB_color_space,是 3D 空间中的一个点?)。获得去饱和图像的(简化)公式是:

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

分解

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

level = max(R, G, B);

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

其他方法

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

有时,Photoshop 教程不会使用其功能来降低图像的饱和度(降低饱和度功能和调整调色板),而是为了获得更好的结果,他们添加具有统一颜色的图层(根据以下值计算)亮度部分)并将该层与原始图像合并(搜索教程并重现代码中的步骤)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将图像转换为灰度? 的相关文章

  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • 使用 HttpClient 时,为什么服务器响应中省略了 Content-Length 标头?

    我正在使用这个问题的源代码如何异步执行httprequest并显示下载响应的进度 https stackoverflow com questions 9594318 how to asynchronous perform a httpreq
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • API29 上不推荐使用 setColorFilter

    我使用以下行来更改 VectorDrawable 的颜色 mydrawable getBackground setColorFilter color PorterDuff Mode SRC ATOP 这很好用 尽管它现在已被弃用 文档建议我
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • Google 地图删除标记路线上下文菜单

    我使用 Android Studio 的 Google 地图模板启动了一个新项目 并在地图上添加了一个标记 LatLng location new LatLng lat lng Marker marker mMap addMarker ne
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 如何从android中的外部存储中获取所选文件的文件路径?

    我在选择文件的文件路径时遇到问题 我搜索了整个堆栈溢出 但问题没有解决 从设备中选择文件的代码如下所示 Intent intent new Intent Intent ACTION GET CONTENT intent setType in
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • 由于“进程崩溃”,仪器运行失败。

    我想运行以下测试 package com xxx yyy import android content Context import androidx test InstrumentationRegistry import androidx
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐

  • jQuery 数据表问题

    当使用jQuery 数据表插件 http datatables net 为什么我会收到此错误 k 未定义 style typeof e saved aaSorting 未定义 我发布这个答案是为了记录一些东西以供自己将来参考 我希望它能对其
  • EqualityComparer.Default 不够聪明

    我正在阅读源代码EqualityComparer
  • 带有圆角的 AppWidget 图像

    因此 我通过在应用程序的主布局中向用户显示的各种视图进行动画处理 在应用程序中动态创建图像 目前 我正在相对布局中生成场景 将布局图像作为位图 然后将位图保存到 SD 以便 appwidget 通过 uri 访问 这一切都工作得很好 但是
  • 如何在Linux内核中找到sk_buff的所有者套接字?

    我正在尝试找到一个的所有者插座sk buff举例来说 skb 我的最终目标是找到特定的 TCP 选项并以某种方式让用户空间应用程序知道 我打算在找到TCP选项时设置一个套接字选项并让用户空间应用程序调用getsockopt 因此我需要知道之
  • Python 字符串转 Int 或 None

    学习Python 有点卡壳 我正在尝试将变量设置为等于int stringToInt 或者如果字符串为空则设置为None 我尝试做variable int stringToInt or None但如果字符串为空 则会出错 而不仅仅是将其设置
  • Django模型列表顺序字段更新

    我有一张桌子 比方说Book 具有以下模型定义 class Book models Model name models CharField name of the book max length 10 sequence models Int
  • System.Threading.Tasks.Dataflow 和 Microsoft.Tpl.Dataflow 之间有什么区别

    有 2 个不同的官方 TPL Dataflow nuget 包 我很困惑选择应该使用哪一个 据我了解 System Threading Tasks Dataflow 版本比其他版本稍新 而且 System Threading Tasks D
  • 警告 - 初始化使指针来自整数而不进行强制转换

    我发现了类似的问题 但我认为它们不适用于我的具体问题 所以如果它们适用 我很抱歉 我作为一年级 CS 学生正在学习 C 并尝试用 C 进行测验 但我一无所获 因为每次我尝试编译以查看它是否正常工作时 我都会收到消息 警告 初始化使指针从未经
  • 新数据框列作为另一个数据框的函数(摘要)对我不起作用

    我想创建一个新的计算列 另一列文本的摘要 为了让您重现 我创建了一个 df 作为可重现的示例 df lt data frame name replicate 1000 paste sample LETTERS 20 replace TRUE
  • 如何添加case语句以在每条记录后添加break?

    每行之后应该有一个休息时间LIKE A 当找到下一条记录时LIKE B stmt con gt prepare SELECT FROM fistevent WHERE Event Id AND TicketType AND row name
  • 无需 jQuery 即可获得 innerWidth() 等效项

    我目前正在努力从我编写的一些代码中消除 jQuery 并且我有一部分代码 其中我正在计算某些代码的内部和外部宽度span元素 这好像是 getBoundingClientRect 对于获取元素的外部宽度效果很好 但我在获取内部宽度方面有点困
  • 如果参数有成员变量则特殊化函数

    我有一个模板化的错误报告函数 因为它可以报告许多不同消息类别的错误 template
  • 将希腊字符和星号 (*) 添加到轴标题

    我想在 R 中的直方图的 x 轴上添加一个希腊字符 我可以单独写希腊字符或与帽子一起写 但问题是我需要这个字符带有帽子和星号 一起 更具体地说 我想要像 hat phi 这是我所做的 x rnorm 1000 hist x nclass 1
  • sublime text-“列出包含“查找”字符串的行

    如何列出包含 find 命令中的匹配项的行 即 我想在单独的窗口中列出所有匹配的行 目前只能转到下一个 上一个 查找 Try Find in Files Cmd Shift F on a Mac presumably Ctrl Shift
  • 多个线程同时使用同一个 JDBC 连接

    我试图更好地理解如果多个线程尝试使用相同的 JDBC 连接同时执行不同的 sql 查询会发生什么 结果在功能上是否正确 对性能有何影响 会穿线A必须等待线程B完全完成其查询 或者会穿线A能够在线程之后立即发送其查询B已发送查询 之后数据库将
  • 如何使用 Hibernate Criteria 选择嵌套属性

    我有三个实体 例如注册 用户和国家 地区 基本上 一个注册属于一个用户 一个用户属于一个国家 现在我尝试使用以下内容从注册中选择国家 地区名称 Criteria criteria getSession createCriteria Regi
  • 调试和发布版本之间可能会出现差异? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么R包lubridate无法解析多种格式的向量?

    我正在使用包lubridate解析异构格式日期的向量并将它们转换为字符串 如下所示 parse date time c 12 17 1996 04 00 00 PM 4 18 1950 0130 c m d Y I M S p m d Y
  • 异步图像下载器

    我编写了一个小类来使用 NSURLConnection 执行图像的下载 其想法是将下载委托给此类以避免阻止执行 因此 我将目标 UIImageView 通过引用 和 url 传递给函数并开始下载 void getImage UIImageV
  • 如何将图像转换为灰度?

    我想通过代码 android 做与上图完全相同的事情 但我对执行此操作的算法感到困惑 我所知道的是 对于每个像素 将 RGB 转换为 HSL 将 HSL 转换回 RGB 谁能帮我解释一下第 2 步要做什么 非常感谢 ps 我可以通过 Col