Добавьте значение к каждому пикселю в изображении, чтобы настроить цвета.Python 3 - PullRequest
0 голосов
/ 24 апреля 2018

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

Вот пример, где я добавляю 40 кзначение зеленого цвета каждого пикселя, но ничего не добавляется к красному и синему каналам:

File name: dragonfly.png
Red tint: 0
Green tint: 40
Blue tint: 0

Мой код находится ниже, и он работает.Но когда я отправляю его, он говорит, что «отправка создала выходное изображение output.png, но оно не соответствовало ожидаемому выходному изображению».Я приложил две картинки - действительную и ожидаемую.

Пожалуйста, посмотрите мой код:

import Image
file = input("File name: ")
red_tint = int(input("Red tint: "))
green_tint = int(input("Green tint: "))
blue_tint = int(input("Blue tint: "))
img = Image.open(file)
r,g,b = img.getpixel( (0,0) )
for y in range(img.height):
    for x in range(img.width):
        current_color = (r,g,b)
        if current_color == r:
            R = r + red_tint
        if current_color == g:
            G = g + green_tint
        if current_color == b:
            B = b + blue_tint
        R, G, B = current_color
        new_color = (R, G, B)
        img.putpixel((x, y), new_color)
img.save('output.png')

Что я делаю неправильно в своем коде?Спасибо

реальная картина actual picture

ожидаемый результат expected outcome

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

EDIT: Вот наиболее векторизованный метод, который обрабатывает целые числа выше 255 правильно

import Image
import numpy as np

r = int(input('Red: '))
g = int(input('Green: '))
b = int(input('Blue: '))

np_img = np.array(img, dtype = np.float32)

np_img[:,:,0] += r
np_img[:,:,1] += g
np_img[:,:,2] += b

np_img[np_img > 255] = 255
np_img = np_img.astype(np.uint8)

img = Image.fromarray(np_img, 'RGB')
img.save('output.png')
0 голосов
/ 07 августа 2018

У меня была та же проблема, что и при задании того же вопроса, и после анализа ответов на все вопросы я нашел решение

    from PIL import Image
    file = input("File name: ")
    red_tint = int(input("Red tint: "))
    green_tint = int(input("Green tint: "))
    blue_tint = int(input("Blue tint: "))
    img = Image.open(file)
    red, green, blue = img.split()
    for y in range(img.height):
       for x in range(img.width):
       value = img.getpixel((x, y))
       new_color = (value[0] + int(red_tint), value[1] + int(green_tint), value[2] + int(blue_tint))
       img.putpixel((x, y), new_color)
    img.save('output.png')

Надеялся, что это помогло

0 голосов
/ 24 апреля 2018

В некотором роде здесь, поскольку я не знаю, что на самом деле генерирует код, но вместо img.putpixel() создайте карту пикселей, например px = img.load(), затем используйте px[x,y] = new_color

РЕДАКТИРОВАТЬ:

Насколько я понимаю, вы просто хотите отредактировать изображение на основе ввода пользователя. Так почему бы просто не добавить значение RGB каждому? Я не проверял этот код.

for y in range(img.height):
    for x in range(img.width):
        current_color = px[x,y]
        new_color = (current_color[0] + int(red_tint), current_color[1] + int(green_tint), current_color[2] + int(blue_tint))
        px[x,y] = new_color
...