编程实现Photoshop的“亮度”滤镜
我有两张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')