4

我有两个 JPEG,并希望将一个叠加在另一个上,其结果与 Photoshop(和 Fireworks)中可用的“亮度”模式相同。您可以在此处阅读有关亮度模式的更多信息:http: //www.adobetutorialz.com/articles/662/1/Photoshop%92s-Luminosity-Mode

我怎样才能做到这一点?编程语言无关紧要,但我最熟悉 Python 和 PHP(按此顺序)。Python Imaging Library 似乎很合适,但 luminosity 不是内置函数,我不知道正确的程序。见http://effbot.org/imagingbook/imagechops.htm

4

5 回答 5

5

首先,您需要了解 Photoshop 的功能。

它保留下层的感知颜色信息,并用顶层的感知光度信息替换它的光度。为此,您需要将图像转换为正确的色彩空间。

如果您决定自己实施所有事情,以下是您需要做的事情的购物清单:

  • 加载源 JPEG 和目标 JPEG
  • 将像素从 RGB 颜色空间转换为 L a b 颜色空间(或任何其他具有发光度信息的颜色空间)
  • 保留目标颜色通道并用源的亮度替换其亮度通道
  • 转换回 RGB 空间
  • 保存 JPEG

如果你觉得 Lab 太复杂,你也可以使用 HSL 颜色空间,它更简单但效果会很差。

于 2009-05-11T19:37:30.443 回答
1

在伪代码中:

foreach rgb_pixel1, rgb_pixel2 in image1, image2 {
    hsl1 = RgbToHsl(rgb_pixel1);
    hsl2 = RgbToHsl(rgb_pixel2);
    hsl3 = hsl(hsl1.h, hsl1.s, hsl2.l);
    output_rgb = HslToRgb(hsl3);
}

从 rgb 到 hsl 的转换在这里

于 2009-05-11T19:41:58.253 回答
1

我不知道这个特定的过滤器,但我可以告诉你如何遵循PIL中的 Coincoin 步骤。我实际上并没有运行代码,但您可以将其用作参考:

加载源 JPEG 和目标 JPEG

from PIL import Image
img1 = Image.open('image1.jpg')
img2 = Image.open('image2.jpg')

将像素从 RGB 颜色空间转换为 L a b 颜色空间(或任何其他具有发光度信息的颜色空间)

# Color matrix for Lab
colorMatrix = (
    x1, y1, z1, 0,
    x2, y2, z2, 0,
    x3, y3, z3, 0
)
img1 = img1.convert("RGB", colorMatrix)
img2 = img2.convert("RGB", colorMatrix)

保留目标颜色通道并用源的亮度替换其亮度通道

l1, a1, b1 = img1.split()
l2, a2, b2 = img2.split()
img1.putdata(zip(l1.getdata(), a2.getdata(), b2.getdata()))

转换回 RGB 空间

# Color matrix for RGB
RGBcolorMatrix = (
    x1, y1, z1, 0,
    x2, y2, z2, 0,
    x3, y3, z3, 0
)
img1 = img1.convert("RGB", RGBcolorMatrix)

保存 JPEG

img1.save('new_image.jpg')
于 2009-05-11T21:07:00.220 回答
0

Gimp 是另一种选择——它有一个脚本接口和一个 python api——这是一篇关于luminosity 和 Gimp的文章。不确定它是否与您想要的效果相同。

于 2009-05-11T19:36:31.507 回答
0

你可以看看OpenCV图像处理库。它具有 Python 绑定并为您处理许多这些较低级别的图像处理任务,或者至少使它们更容易。

于 2009-05-11T19:44:39.480 回答