【问题标题】:Python: Want to change image HSL like photoshopPython:想要像 Photoshop 一样改变图像 HSL
【发布时间】:2019-12-07 15:04:54
【问题描述】:

我想在 Python 中实现此功能(更改 HSL 并勾选该颜色),最好使用 PIL 或 numpy。

有人能解释一下这是如何工作的吗?

据我所知是使用内置函数color_to_hsl获取hsl值,改变它,然后将ti转换回rgb,最后写入单个像素。

有什么线索可以让它更近一点吗?

【问题讨论】:

  • 选中“着色”框后,我认为您正在使用原始图像的灰度值作为亮度,并直接设置色相和饱和度,如对话框中所示。对不起,我没有时间回答,不过这真的很简单。

标签: image-processing python-imaging-library


【解决方案1】:
from PIL import Image
import colorsys

def colorize(im, h, s, l_adjust):
    h /= 360.0
    s /= 100.0
    l_adjust /= 100.0
    if im.mode != 'L':
        im = im.convert('L')
    result = Image.new('RGB', im.size)
    pixin = im.load()
    pixout = result.load()
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            l = pixin[x, y] / 255.99
            l += l_adjust
            l = min(max(l, 0.0), 1.0)
            r, g, b = colorsys.hls_to_rgb(h, l, s)
            r, g, b = int(r * 255.99), int(g * 255.99), int(b * 255.99)
            pixout[x, y] = (r, g, b)
    return result

【讨论】:

  • 非常感谢!我是图像处理的初学者,未来我需要做更多的图像处理。你介意分享一些这方面的链接/书籍吗?
  • @user469652,我不确定我是否能提供任何教材,因为这些年来我只是零碎地捡起它。不过我很好奇,因为我没有 Photoshop,所以我的示例是否与它的结果相匹配?
  • @MarkRansom 你能解释一下-> min(max(l, 0.0), 1.0)
  • @MSI 这是一种确保值保持在范围内的简单方法。如果max(l, 0.0) 大于0.0,则返回原始值,否则返回0.0。同样,min(l, 1.0) 如果小于1.0,则返回原始值,否则返回1.0
【解决方案2】:

这正是你在 Photoshop 中使用颜色检查所做的事情

from PIL import Image
import colorsys

def rgbLuminance(r, g, b):
    luminanceR = 0.22248840
    luminanceG = 0.71690369
    luminanceB = 0.06060791
    return (r * luminanceR) + (g * luminanceG) + (b * luminanceB)


def colorize(im, h, s, l_adjust):
    h /= 360.0
    s /= 100.0
    l_adjust /= 100.0
    result = Image.new('RGBA', im.size)
    pixin = im.load()
    pixout = result.load()
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            currentR = pixin[x, y][0]/255
            currentG = pixin[x, y][1]/255
            currentB = pixin[x, y][2]/255
            lum = rgbLuminance(currentR, currentG, currentB)
            if l_adjust > 0:
                lum = lum * (1 - l_adjust)
                lum = lum + (1.0 - (1.0 - l_adjust))
            else:
                lum = lum * (l_adjust + 1)
            l = lum
            r, g, b = colorsys.hls_to_rgb(h, l, s)
            r, g, b = int(r * 255.99), int(g * 255.99), int(b * 255.99)
            pixout[x, y] = (r, g, b, 255)
    return result

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 2015-06-09
    • 2021-12-25
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2012-10-29
    相关资源
    最近更新 更多