编程实现Photoshop的“亮度”滤镜

4 投票
5 回答
1747 浏览
提问于 2025-04-15 11:31

我有两张JPEG图片,想把其中一张叠加到另一张上,效果要和Photoshop(还有Fireworks)里的“亮度”模式一样。你可以在这里了解更多关于亮度模式的信息:http://www.adobetutorialz.com/articles/662/1/Photoshop%92s-Luminosity-Mode

我该怎么做呢?编程语言其实没什么特别要求,不过我最熟悉的是Python和PHP(顺序是这样)。Python的图像处理库看起来很合适,但亮度并不是一个内置的功能,我不知道该怎么操作。可以参考这个链接:http://effbot.org/imagingbook/imagechops.htm

5 个回答

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,再转换回来,可以在这里找到相关信息。

5

首先,你需要了解Photoshop的工作原理。

它会保留底层的颜色信息,并用顶层的亮度信息来替换底层的亮度。为了做到这一点,你需要把图片转换到合适的颜色空间。

如果你决定自己动手实现这些功能,下面是你需要做的事情清单:

  • 加载源图像和目标图像(都是JPEG格式)
  • 把像素从RGB颜色空间转换到Lab颜色空间(或者其他有亮度信息的颜色空间)
  • 保留目标图像的颜色通道,并用源图像的亮度替换目标图像的亮度通道
  • 再转换回RGB颜色空间
  • 保存JPEG图像

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

1

我对这个具体的滤镜不太了解,但我可以告诉你如何按照Coincoin的步骤在PIL中操作。我没有实际运行过代码,但你可以把它当作参考:

首先,加载源图像和目标图像的JPEG文件。

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

接下来,把像素从RGB颜色空间转换到Lab颜色空间(或者其他包含亮度信息的颜色空间)。

# 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')

撰写回答