【问题标题】:Performing Photoshop's "Luminosity" filter programmatically以编程方式执行 Photoshop 的“亮度”过滤器
【发布时间】:2010-10-25 09:07:23
【问题描述】:

我有两个 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

【问题讨论】:

    标签: php python image image-processing python-imaging-library


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      同时加载源 JPEG 和目标 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')
      

      【讨论】:

      • 其实……不想这么说,但是你能解释一下带有x1、y1、z1的colorMatrix片吗?显然 Python 不允许这样做,因为它们在编译时是未定义的。我应该使用什么 val 来代替您的伪代码中的那些?
      • 有关转换功能以及如何使用它的更多详细信息,请参见此页面pythonware.com/library/pil/handbook/image.htm
      • 您应该能够从参考中获取矩阵值。
      • 如果找不到转换矩阵,则可以使用点函数。你可以这样使用它:img.point(rgb2labfunction)
      • Nadia,img1.putdata(zip(l1, a2, b2)) 行不起作用,因为 l1 是 Image 实例,并且 zip 的第一个参数必须支持迭代。小时。
      【解决方案3】:

      在伪代码中:

      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 的转换是here

      【讨论】:

      • 我想我会先试试这个。另一位评论者说 HSL 质量较差,但我想在我花任何额外时间之前判断这一点。 PIL 不支持 HSL,但显然我可以使用 colorsys 获取 RGB 像素的 HSL 值:effbot.org/zone/pil-hsl.htm
      【解决方案4】:

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

      【讨论】:

      • 可能不是你的错,但该 URL 无法访问。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 1970-01-01
        • 2011-07-12
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多