Как применить цветовую маску к изображению в PIL, Python?

У меня есть изображение, созданное в библиотеке PIL, и есть второе изображение.

Мне нужно взять второе изображение, сделать этот крестик, например красным, и применить его к общему контуру. Как правильно заменить цвет, но не напрямую (FFF на F00), а оставив тени и трехмерный эффект?

Вы хотите сделать крест альфа-маской, затем вы можете изменить цвет, и тень останется, но будет соответствовать цвету креста.

NickSlash 02.05.2024 11:56

Где второе изображение? Как будет выглядеть результат, когда вы это сделаете? Какой код вы пробовали?

Mark Setchell 02.05.2024 15:16

Крест — второе изображение. Первый — это чистый холст, на котором мне нужно разместить зеленый, красный и синий кресты.

Kucherov Egor 02.05.2024 15:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот шаги:

  • загрузить свое изображение
  • позвоните ImageOps.colorize(..., white='red'), чтобы изображение менялось от черного к красному, а не от черного к белому
  • создайте фоновое изображение с помощью Image.new()
  • вставить на фон с помощью paste(..., mask=originalImage) — маска гарантирует, что вы вставите только на фон там, где исходное изображение непрозрачно, а не там, где оно прозрачно.

Так:

from PIL import Image, ImageOps

# Load image
im = Image.open('cross.png')

# Colorize
red = ImageOps.colorize(im.convert('L'), black='black', white='red')
red.save('DEBUG-red.png')

# Make solid white background, same size as cross
bg = Image.new('RGB', size=im.size, color='white')

# Paste
bg.paste(red, mask=im)

DEBUG-red.png

результат.png


Вот немного другой подход с использованием цветового пространства HSV:

  • создайте одноканальное изображение для использования в качестве оттенка, установив для него угол оттенка, равный нулю, т.е. красный
  • создайте одноканальное изображение для использования в качестве насыщенности, установите его на 50%, чтобы оно не было слишком ярким
  • получить яркость исходного перекрестного изображения для использования в качестве канала значения
  • объединить каналы HSV и вставить, как раньше

from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 0 degrees, i.e. red
Hue = Image.new('L', size=im.size, color=0)
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')

Или сделайте ненасыщенный синий — измените 128 на 255, чтобы сделать ярким и насыщенным:

from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 240 degrees scaled to unsigned char range
Hue = Image.new('L', size=im.size, color=int(240*255/360))
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')

Другие вопросы по теме