Изменить фон и цвет пикселя изображения - PullRequest
0 голосов
/ 22 мая 2018

Для эксперимента я хочу показать рисунки участников из базы данных, которая включает черные нарисованные линии на белом фоне.В конце концов, я только хочу показать, что такое «нарисованная часть» на изображение определенного цвета.Поэтому я хочу, чтобы белые части изображения были серыми, чтобы они не отличались от серого фона.И я хочу показать черные части изображения (фактический рисунок) другими цветами, например красным.

Я довольно новичок в программировании и до сих пор не смог найти ответ.Я попробовал несколько вещей, включая 2 варианта ниже.

Может кто-нибудь показать мне пример того, как изменить цвета изображения, которое я прикрепил к этому сообщению?Это было бы очень ценно![введите описание изображения здесь] [1]

    ####### OPTION 1, not working
#picture = Image.open(fname)
fname = exp.get_file('PICTURE_1.png')
picture = Image.open(fname)

# Get the size of the image
width, height = picture.size

# Process every pixel
for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if current_color == (255,255,255): 
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif current_color == (0,0,0):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
           picture.show()

#picture.show()
win.flip()
clock.sleep(1000)
Реализованные изменения, как вы предложили, дают: TypeError: у объекта 'int' нет атрибута ' getitem '
for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if (current_color[0]<200) and (current_color[1]<200) and (current_color[2]<200):
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif (current_color[0]>200) and (current_color[1]>200) and (current_color[2]>200):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
           picture.show()

Ответы [ 2 ]

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

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

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

Если по какой-то причине вам необходимо изменить изображение так, как это делает PsychoPyпо своей сути разрешают (и если скорость обработки имеет значение), тогда вы должны попытаться изменить все пиксели за одну операцию (используя числовые массивы), а не по одному пикселю за раз в цикле for.

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

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

Вместо того, чтобы говорить if current_color == (255,255,255):, вы должны вместо этого поставить
if (current_color[0]>200) and (current_color[1]>200) and (current_color[2]>200):
как будто белые части изображения выглядят белыми, поэтому пиксели могут не быть точно (255,255,255).

Я думал, что вы хотите перевернуть белые частисерый, а черные части красные?В вашем коде для первого варианта строки
if current_color == (255,255,255): new_color = (255,0,0)
станут белыми пикселями красного цвета.Чтобы сделать черные пиксели красными, это должно быть if current_color == (0,0,0).

Если ваш код все еще не работает при внесении этих изменений, вы можете попробовать создать новое изображение с такими же размерами, что и исходное, и добавитьпикселей к новому изображению, а не редактируйте пиксели в исходном.

Кроме того, было бы полезно, если бы вы могли рассказать нам, что на самом деле происходит при запуске кода.Есть ли сообщение об ошибке, или изображение показывается, но изображение не является правильным?Не могли бы вы приложить пример выходных данных?

Обновление: я возился с вашим кодом и заставил его делать то, что вы хотите.Вот код, с которым я закончил:

import PIL
from PIL import Image

picture = Image.open('image_one.png')

# Get the size of the image
width, height = picture.size

for x in range(width):
   for y in range(height):
       current_color = picture.getpixel( (x,y) )
       if (current_color[0]<200) and (current_color[1]<200) and (current_color[2]<200):
           new_color = (255,0,0)
           picture.putpixel( (x,y), new_color)
       elif (current_color[0]>200) and (current_color[1]>200) and (current_color[2]>200):
           new_color2 = (115,115,115)
           picture.putpixel( (x,y), new_color2)
picture.show()

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

...