使用 Java BufferedImage 的图像过滤器:如何更改所有像素颜色,直到它们收敛为全灰图像

Image filter with Java BufferedImage: how to change all pixels colors untill they converge to a total gray image

我有一个起始 BufferedImage(下图中的 (a))。我不知道如何调用这个过滤器,但我需要将所有图 (a) 像素从 (b) 逐渐转换为 (c),直到它们都变成灰色 (d)。我怎样才能做到这一点?谢谢!

看起来可以通过线性插值来实现。我不会深入讨论代码的细节,只是给你一个算法,让你走上正轨。

假设颜色表示为范围为 [0,1] 的 RGB 浮点值。所以 (0.0,0.0,0.0) 表示 0% 红色,0% 蓝色和 0% 绿色; (0.5,0.4,0.3) 表示 50% 红色、40% 蓝色和 30% 绿色。如果你的颜色在 [0,255] 范围内,它应该是一样的。我更喜欢 [0,1] 范围,因为它对某些着色器效果更好。您始终可以除以 255 使它们进入 [0,1] 范围,并在末尾乘以 255 使它们回到原始范围。

您有两张图片:您的基础图片(我们称之为 Source)和完全不透明的 post 处理效果(在本例中为纯灰色,我们称之为 Target ).

要在它们之间进行线性插值,您只需将它们的 RGB 值添加一个随时间变化的因子加权,源从 0 到 1,目标从 1 到 0,因此两个 RGB 值的总和永远不会超出各自通道的颜色范围。

以你为例:

  • 对于 a),您将使用 RGB(Source) * 1.0 + RGB(Target) * 0.0
  • 对于 b),您将使用 RGB(Source) * 0.667 + RGB(Target) * 0.333
  • 对于 c),您将使用 RGB(Source) * 0.333 + RGB(Target) * 0.667
  • 对于 d),您将使用 RGB(Source) * 0.0 + RGB(Target) * 1.0