Выполнение фильтра «Яркость» в Photoshop программным способом - PullRequest
3 голосов
/ 11 мая 2009

У меня есть два JPEG, и я хотел бы наложить один на другой с теми же результатами, что и в режиме «Яркость», доступном в Photoshop (и Fireworks). Вы можете узнать больше о режиме Luminosity здесь: http://www.adobetutorialz.com/articles/662/1/Photoshop%92s-Luminosity-Mode

Как я могу это сделать? Язык программирования не имеет большого значения, но я лучше всего владею Python и PHP (в таком порядке). Библиотека изображений Python идеально подходит, но яркость не является встроенной функцией, и я не знаю правильной процедуры. Смотри http://effbot.org/imagingbook/imagechops.htm

Ответы [ 5 ]

5 голосов
/ 11 мая 2009

Сначала вы должны понять, что делает Photoshop.

Он сохраняет информацию о восприятии цвета под слоем и заменяет ее яркость информацией о восприятии яркости верхнего слоя. Для этого вам нужно конвертировать изображения в правильное цветовое пространство.

Вот список покупок, который вам нужно будет сделать, если вы решите реализовать все самостоятельно:

  • Загрузка как исходного, так и целевого JPEG
  • Преобразование пикселей из цветового пространства RGB в цветовое пространство L a b (или любое другое цветовое пространство с яркой информацией)
  • Сохранение целевых цветовых каналов и замена их канала яркости на яркость источника
  • Преобразование обратно в пространство RGB
  • Сохранить JPEG

Если вы считаете, что Lab слишком сложен, вы также можете использовать цветовое пространство HSL, оно намного проще, но даст худшие результаты.

1 голос
/ 12 мая 2009

Я не знаю об этом конкретном фильтре, но могу рассказать вам, как выполнить шаги Coincoin в PIL . На самом деле я не запускал код, но вы можете использовать его в качестве справки:

Загрузка исходного и целевого 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')
1 голос
/ 11 мая 2009

В псевдокоде:

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 и обратно здесь .

0 голосов
/ 11 мая 2009

Вы можете взглянуть на библиотеку обработки изображений OpenCV . Он имеет привязки Python и выполняет многие из этих задач обработки изображений более низкого уровня для вас, или, по крайней мере, облегчает их.

0 голосов
/ 11 мая 2009

Gimp был бы другим вариантом - он имеет интерфейс сценариев и интерфейс Python - вот статья о яркости и Gimp . Не уверен, что это тот же эффект, что и вы.

...