Изменение цвета пикселя с помощью PIL на Python - PullRequest
0 голосов
/ 29 мая 2018

Я очень плохо знаком с программированием и узнаю больше об обработке изображений с использованием PIL.

У меня есть определенная задача, которая требует, чтобы я изменил цвет каждого конкретного пикселя другим цветом.Поскольку требуется изменить несколько пикселей, я создал цикл for для доступа к каждому пикселю.Скрипт, по крайней мере, «работает», но в результате получается черный экран с цветом (0, 0, 0) в каждом пикселе.

from PIL import Image
img = Image.open('/home/usr/convertimage.png')
pixels = img.load()
for i in range(img.size[0]):
    for j in range(img.size[1]):
            if pixels[i,j] == (225, 225, 225):
                pixels[i,j] = (1)
            elif pixels[i,j] == (76, 76, 76):
                pixels [i,j] = (2)
            else: pixels[i,j] = (0)
img.save('example.png')

У меня есть изображение в градациях серого.Есть определенные цвета, и есть градиентные цвета около границ.Я пытаюсь заменить каждый конкретный цвет другим цветом, а затем заменить градиентные цвета другим цветом.

Однако, судя по жизни, я вообще не понимаю, почему мой вывод получается с одним (0, 0, 0) цветом.

Я пытался найти ответонлайн и друзья, но не смогли придумать решение.

Если кто-нибудь там знает, что я делаю не так, любая обратная связь будет высоко оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Проблема в том, что ваше изображение, как вы сказали, оттенки серого , поэтому в этой строке:

if pixels[i,j] == (225, 225, 225):

ни один пиксель никогда не будет равен триплету RGB (255,255,255), потому чтобелые пиксели будут просто шкалой оттенков серого 255, а не RGB-триплетом.

Это прекрасно работает, если вы измените цикл на:

        if pixels[i,j] == 29:
            pixels[i,j] = 1
        elif pixels[i,j] == 179:
            pixels [i,j] = 2
        else:
            pixels[i,j] = 0

Вот результат с контрастным растяжением:

enter image description here


Возможно, вы захотите выполнить преобразование, используя «Таблица поиска» или LUT, как большоечисла if операторов могут быть громоздкими.По сути, каждый пиксель в изображении заменяется новым, найденным путем поиска его текущего индекса в таблице.Я делаю это с numpy для развлечения тоже:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open the input image
PILimage=Image.open("classified.png")

# Use numpy to convert the PIL image into a numpy array
npImage=np.array(PILimage)

# Make a LUT (Look-Up Table) to translate image values. Default output value is zero.
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Transform pixels according to LUT - this line does all the work
pixels=LUT[npImage];

# Save resulting image
result=Image.fromarray(pixels)
result.save('result.png')

Результат - после растяжения контраста:

enter image description here


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

import numpy as np
from PIL import Image

# Open the input image as numpy array
npImage=np.array(Image.open("classified.png"))

# Make a LUT (Look-Up Table) to translate image values
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Apply LUT and save resulting image
Image.fromarray(LUT[npImage]).save('result.png')
...