Преобразуйте несколько изображений в негатив с помощью PIL - PullRequest
2 голосов
/ 29 января 2020

Я хочу прочитать все изображения в папке и преобразовать их в негативы одного и того же изображения

# Import library to work with Images
from PIL import Image

# Make negative pixel
def negatePixel(pixel):
    return tuple([255-x for x in pixel])

#img_dir = "" # Enter Directory of all images 

for i in range(1,130):
    # Original Image
    img = []
    img = Image.open(str(i) + '.jpg')
    # New clear image
    new_img = Image.new('RGB', img.size)

    # Get pixels from Image
    data = img.getdata()
    # Create map object consists of negative pixels
    new_data = map(negatePixel, data)

    # Put negative pixels into the new image
    new_img.putdata(list(new_data))
    # Save negative Image
    new_img.save(str(i) + 'neg.jpg')

    print ('saved image' + str(i))

Я получаю эту ошибку:

Traceback (most recent call last):
  File "2.py", line 23, in <module>
    new_img.putdata(list(new_data))
  File "2.py", line 6, in negatePixel
    return tuple([255-x for x in pixel])
TypeError: 'int' object is not iterable

Я написал Вышеприведенная программа выполняет то, что я хотел, но она поражает ошибкой. Я новичок в программировании и есть ли идеи, как решить эту проблему?

1 Ответ

4 голосов
/ 29 января 2020

Ваш подход не идеален. Во-первых, вы можете сделать это намного проще с ImageMagick , который включен в большинство Linux дистрибутивов и доступен для macOS и Windows. Просто в Терминале это инвертирует все файлы в текущем каталоге:

magick mogrify -negate *.jpg

Или, если вы хотите, чтобы они были сохранены в каталоге с именем results:

mkdir results
magick mogrify -path results -negate *.jpg

Если вы хотите придерживаться Python и PIL / Pillow, в его ImageOps модуле уже есть invert() функция :

#!/usr/local/bin/python3

from PIL import Image, ImageOps

# Load image 
im = Image.open('image.jpg')

# Invert
result = ImageOps.invert(im)

# Save
result.save('result.jpg')

Если вы не хотите использовать встроенный invert(), вам будет намного лучше, если использовать point() функцию здесь :

#!/usr/local/bin/python3

from PIL import Image

# Load image 
im = Image.open('image.jpg')

# Negate
result = im.point(lambda p: 255 -p)

# Save
result.save('result.jpg')

Примечание : Как правило, как только вы начинаете использовать for l oop или getdata() с изображением в Python, вы, вероятно, уже ошиблись. Вы должны использовать встроенные библиотечные функции или Numpy на самом деле, в противном случае все будет бездействующим.

...