Используя PIL (Pillow) и Image, но сохраняя хорошее разрешение - PullRequest
2 голосов
/ 23 мая 2019

Я использую PIL , чтобы изменить размеры моих изображений. Большинство из них 640x480 , некоторые из них больше. Большинство из них находятся в png, но у меня тоже есть расширение jpeg. Я хочу изменить размер всех моих изображений до 32x32 пикселей, но я заметил, что разрешение, похоже, меняется после использования PIL.

Я обнаружил, что это типичный вопрос, и часто возникает проблема, когда вы сохраняете изображение. Я пробовал с разными значениями " quality ", я читал документацию, пробуя разные параметры, такие как " subsampling " и пробуя оба формата jpeg и png.

Вот мой код:

from PIL import Image

im = Image.open(os.path.join(my_path, file_name))
            img = im.resize((32, 32))
            if grey_scale is True:
                img = img.convert('L')  # to resize image in gray scale
            img.save(os.path.join(my_path, 
file_name[:file_name.index('.')] + '.jpg'), "JPEG", quality=100) 

Здесь у меня есть входное изображение Original input image

Здесь у меня есть зернистый вывод , полученный с моим кодом

enter image description here* * 1030

Как я могу изменить размеры моих изображений, чтобы они были меньше, но с очень хорошим разрешением?

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Вид преобразования изображения, который вы хотите, невозможен. Как и при попытке изменить размер растрового изображения до меньших размеров в пикселях, вы должны либо уменьшить его, либо не делать его вообще (простое изменение размера). Даже если вы можете сохранить разрешение (общее количество пикселей на изображении), но при этом пиксель может представлять один цвет за раз (по крайней мере, на субпиксельном дисплее, например, на мониторе), а ваше окончательное изображение имеет только 1024 из их, и детализация в исходном изображении намного больше, чем то, что может быть представлено этим количеством пикселей, это всегда приведет к значительно более низкому качеству (пиксельное изображение с артефактами) в конечном изображении.

Но это не общий случай, так как он во многом зависит от того, какие детали представлены изображением. Если изображение не сложное (не содержит много изменений цвета), его можно изменить до значительно более низкого качества, не теряя деталей.

746x338 размерное изображение

enter image description here

32x32 размерная версия предыдущего изображения

enter image description here

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

Теперь, если тот же процесс будет опробован на сложном изображении, подобном тому, который вы дали в вопросе, результатом будет пиксельное изображение.

РЕШЕНИЕ: -

  • Вы можете выбрать большое значение размера в конечном изображении. (намного больше, чем 32x32), если вы хотите сохранить качество изображения.

  • Создайте векторный эквивалент вашего изображения с разрешением независимый и может быть изменен до большего / меньшего физического размера без влияния на качество изображения.

P.S: -. Не сохраняйте изображение .png с расширением .jpg, поскольку jpg - это метод сжатия с потерями (по большей части), который, в свою очередь, приводит к более низкому качеству конечного изображения, чем к оригиналу, даже если манипуляция не выполняется Это.

0 голосов
/ 10 июля 2019

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

В этом случае вы можете использовать разные фильтры. Смотрите ниже код

from PIL import Image
import os
import PIL
filters = [PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,  PIL.Image.ANTIALIAS]
grey_scale = False
i = 0
for filter in filters:
    im = Image.open("./image.png")
    img = im.resize((32, 32), filter)
    if grey_scale is True:
        img = img.convert('L')  # to resize image in gray scale
    i = i + 1
    img.save("./" + str(i) + '.jpg', "JPEG", quality=100)

Результаты:

Nearest Bilinear Bicubic Antialias

Далее, используя resize, вы не поддерживаете соотношение сторон. Поэтому вместо использования resize используйте метод thumbnail, который также сохраняет соотношение сторон

from PIL import Image
import os
import PIL
filters = [PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,  PIL.Image.ANTIALIAS]
grey_scale = False
i = 5
for filter in filters:
    im = Image.open("./image.png")
    img = im.thumbnail((32, 32), filter)
    img = im
    if grey_scale is True:
        img = img.convert('L')  # to resize image in gray scale
    i = i + 1
    img.save("./" + str(i) + '.jpg', "JPEG", quality=100)

Результаты:

Nearest Bilinear Bicubic AntiAlias

...