Изменить цвет изображения в модуле PIL - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь изменить интенсивность цветов, чтобы получить другое цветное изображение ...

import PIL
from PIL import Image
from PIL import ImageEnhance
from PIL import ImageDraw

# read image and convert to RGB
image=Image.open("readonly/msi_recruitment.gif")
image=image.convert('RGB')

# build a list of 9 images which have different brightnesses
enhancer=ImageEnhance.Brightness(image)
images=[]
for i in range(1, 10):
    images.append(enhancer.enhance(i/10))

# create a contact sheet from different brightnesses
first_image=images[0]
contact_sheet=PIL.Image.new(first_image.mode, (first_image.width*3,first_image.height*3))
x=0
y=0

for img in images:
    # Lets paste the current image into the contact sheet
    contact_sheet.paste(img, (x, y) )
    # Now we update our X position. If it is going to be the width of the image, then we set it to 0
    # and update Y as well to point to the next "line" of the contact sheet.
    if x+first_image.width == contact_sheet.width:
        x=0
        y=y+first_image.height
    else:
        x=x+first_image.width

# resize and display the contact sheet
contact_sheet = contact_sheet.resize((int(contact_sheet.width/2),int(contact_sheet.height/2) ))
display(contact_sheet)

Но приведенный выше код просто меняет яркость .... Скажите, пожалуйста, какие изменения я должен внести в изменить интенсивность цвета в этом коде ..... Извините, но я не могу загрузить изображение сейчас, рассмотрите любое изображение, которое вы считаете подходящим, и помогите мне ... Оценили !!!!

Пожалуйста go по этой ссылке и отвечу на этот вопрос, а не на этот, приношу извинения за неудобства ....

Интенсивность цвета пикселей

1 Ответ

0 голосов
/ 13 апреля 2020

Многие цветовые операции лучше всего выполнять в цветовом пространстве, например HSV , который можно получить в PIL с помощью:

HSV = rgb.convert('HSV')

Затем можно использовать split(), чтобы получить 3 отдельных канала. :

H, S, V = hsv.split()

Теперь вы можете изменить свои цвета. Ты кажешься немного неясным в том, что хочешь. Если вы хотите изменить интенсивность цветов, т.е. сделать их менее насыщенными и менее яркими, уменьшите S (Насыщенность). Если вы хотите изменить красные оттенки на пурпурные, то есть изменить оттенки, добавьте что-то в канал оттенков. Если вы хотите сделать изображение ярче или темнее, измените канал Value (V).

Когда вы закончите, объедините merge((H,S,V)) отредактированные каналы вместе и конвертируйте обратно в RGB с помощью convert('RGB').

См. Разделение и объединение и Обработка отдельных полос на этой странице .


Вот пример использования это изображение:

enter image description here

Вот базовая структура c для загрузки изображения, преобразования в цветовое пространство HSV, разделения каналов, некоторой обработки, рекомбинируйте каналы и вернитесь к цветовому пространству RGB и сохраните результат.

#!/usr/bin/env python3

from PIL import Image

# Load image and create HSV version
im = Image.open('colorwheel.jpg')
HSV= im.convert('HSV')

# Split into separate channels
H, S, V = HSV.split()

######################################
########## PROCESSING HERE ###########
######################################

# Recombine processed H, S and V back into a recombined image
HSVr = Image.merge('HSV', (H,S,V))
# Convert recombined HSV back to reconstituted RGB
RGBr = HSVr.convert('RGB')

# Save processed result
RGBr.save('result.png')

Итак, если вы найдете блок с надписью "ОБРАБОТКА ЗДЕСЬ" и поместите туда код, чтобы разделить насыщенность на 2, это сделает цвета менее яркими:

# Desaturate the colours by halving the saturation
S = S.point(lambda p: p//2) 

enter image description here

Если вместо этого мы наполовину уменьшим яркость (V), как показано ниже:

# Halve the brightness
V=V.point(lambda p: p//2) 

результат будет темнее:

enter image description here

Если вместо этого мы добавим 80 к оттенку, все цвета будут вращаться вокруг круга - это называется "вращение оттенка" :

# Rotate Hues around the Hue circle by 80 on a range of 0..255, so around 1/3 or a circle, i.e. 120 degrees:
H = H.point(lambda p: p+80) 

, которое дает это:

enter image description here

...