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

1
 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 для преобразования изображения, переданного как параметр в оттенки серого. Результат я получаю, хотя, не правильно. Здесь вход и выход. Где это неправильно?

Изображение 174551

Изображение 174551

Теги:
image-processing
arrays
pillow
grayscale

1 ответ

2
Лучший ответ

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

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

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

Это дает вам

Изображение 174551


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

image.convert('L')

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

  • 0
    Зачем конвертировать в LA вместо L ? Даже если в исходном изображении есть альфа-канал (и тот факт, что он загружен здесь как .jpg, подразумевает, что его, вероятно, нет), OP, вероятно, не заботится об этом.
  • 1
    @abarnert Я опередил тебя примерно на 10 секунд!
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню