Преобразование изображения в оттенки серого дает неверный результат

 def desaturate_image(self, image):
    desatimage = Image.new(image.mode, image.size)
    pixellist = []
    print(len(pixellist))
    for x in range(image.size[0]):
        for y in range(image.size[1]):
            r, g, b = image.getpixel((x, y))
            greyvalue = (r+g+b)/3
            greypixel = (int(round(greyvalue)), int(round(greyvalue)), int(round(greyvalue)))
            pixellist.append(greypixel)
    print(pixellist)
    desatimage.putdata(pixellist)
    return desatimage

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

1 ответ

Решение

Сначала вы перебираете пиксели с неправильным размером - изображения подушек располагаются по порядку столбцов. Так ты хочешь

...
for y in range(image.size[1]):
    for x in range(image.size[0]):
...

так, что ваш список пикселей хранит пиксели по столбцам.

Это дает вам


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

image.convert('L')

Как уже упоминалось ниже, это дает вам изображение в режиме оттенков серого ('L') в отличие от вашего текущего ответа, который держит изображение в режиме RGB ('RGB') с трехкратным повторением данных.

Другие вопросы по тегам