Python PIL: лучший метод масштабирования, который сохраняет линии - PullRequest
9 голосов
/ 17 августа 2011

У меня есть 2D-чертеж с черным фоном и белыми линиями (экспортировано из Autocad), и я хочу создать миниатюру с сохранением линий, используя Python PIL library .

Но что яПолучите, используя метод 'thumbnail', просто черное изображение с белыми точками.

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

После ваших комментариев вот мой пример кода:

from PIL import Image
fn = 'filename.gif'
im = Image(fn)
im.convert('RGB')
im.thumbnail((300, 300), Image.ANTIALIAS)
im.save('newfilename.png', 'PNG')

Как я могу это сделать?

Ответы [ 2 ]

13 голосов
/ 18 августа 2011

Используемый thumbnail метод изменения размера по умолчанию - NEAREST, что является действительно плохим выбором. Например, если вы измените размер до 1/5 от исходного размера, он выведет один пиксель, а затем выкинет следующие 4 - у линии шириной в один пиксель есть только 1 из 5 шансов показать на всех в результате!

Удивительно, что BILINEAR и BICUBIC не намного лучше. Они берут формулу и применяют ее к 2 или 3 ближайшим пикселям к исходной точке, но по-прежнему остается много пикселей, на которые они не смотрят, и формула в любом случае ослабит линию.

Наилучшим выбором является ANTIALIAS, который, по-видимому, учитывает все исходное изображение, не выбрасывая пиксели. Линии станут тусклыми, но не исчезнут полностью; при необходимости вы можете сделать дополнительный шаг, чтобы улучшить контраст.

Обратите внимание, что все эти методы будут возвращаться к БЛИЖАЙШЕМУ, если вы работаете с изображением в палитре, т.е. im.mode == 'P'. Вы всегда должны конвертировать в 'RGB'.

from PIL import Image
im = Image.open(fn)
im = im.convert('RGB')
im.thumbnail(size, Image.ANTIALIAS)

Вот пример, взятый с сайта electronics.stackexchange https://electronics.stackexchange.com/questions/5412/easiest-and-best-poe-ethernet-chip-micro-design-for-diy-interface-with-custom-ard/5418#5418

Использование алгоритма NEAREST по умолчанию, который, как я полагаю, аналогичен вашим результатам:

NEAREST

Использование алгоритма ANTIALIAS:

ANTIALIAS

3 голосов
/ 17 августа 2011

По умолчанию im.resize использует фильтр NEAREST, который будет делать то, что вы видите - потерять информацию, если он не попадет на пиксель с соответствующей модуляцией.

Вместо звоните

im.resize(size, Image.BILINEAR)

Это должно сохранить ваши строки. Если нет, попробуйте Image.BICUBIC или Image.ANTIALIAS. Любой из них должен работать лучше, чем NEAREST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...