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

#python #image #colors #python-imaging-library

Вопрос:

У меня есть изображение, состоящее из 25 цветов. Его разрешение 720×1280 , и я хочу уменьшить его до 144×256 (оно находится в соотношении с исходным). Я использую PIL в python для достижения той же цели

Вот мой код:-

 o=PIL.Image.open('original25.png')
o=o.resize((144,256),resample=PIL.Image.LANCZOS)
o.save('3_.png')
 

Проблема в том, что новое изображение имеет много цветов (около 15000), в то время как исходное изображение имело только 25 цветов.

Как уменьшить размер изображения без увеличения количества цветов?

Примечание:-Я немного поэкспериментировал со своей стороны и поиграл с фильтром «повторная выборка». Используя БЛИЖАЙШУЮ опцию, в конечном результате было только 25 цветов, которые я хотел. Но, к сожалению, качество изображения стало очень плохим и было заполнено белыми пикселями (практически непригодными для использования). А при использовании БИЛИНЕЙНЫХ /БИКУБИЧЕСКИХ /ЛАНЦЕТОВ количество цветов увеличивалось

Редактировать:- Пример изображения https://drive.google.com/file/d/1tBjnU1NkN0x72tHTuCQOBZUxTfxNxq9w/view?usp=sharing

Комментарии:

1. В MATLAB есть простое решение с использованием rgb2ind . Я не могу найти эквивалент Python. Вы можете попробовать подход K-Средних для уменьшения количества цветов. Вы также можете рассмотреть возможность использования ImageMagick (существует привязка Python с именем Wand).

2. Пожалуйста, опубликуйте изображение.

3. @HansHirse Привет, я только что добавил пример

4. @Rotem Спасибо за ответ. Да, я могу использовать любую библиотеку python, и я обязательно попробую ваши предложения

5. Может быть, вы могли бы уточнить, почему вам нужно 25 цветов? А если вам обязательно нужны точно такие же 25 цветов, с которых вы начинали?

Ответ №1:

Используйте повторную выборку «Ближайший сосед» вместо Lanczos, чтобы сохранить оригинальные цвета.

Или, если после изменения размера можно использовать 25 новых цветов, вы можете использовать Lanczos для изменения размера, Image.quantize() а затем вернуться к 25 цветам — предпочтительно с помощью метода LIBIMAGEQUANT.

Вот что делает ImageMagick с помощью пересчета ближайших соседей — вы не показываете свой «супер дрянной» результат:

введите описание изображения здесь

Комментарии:

1. Спасибо за ответ. Да, я могу использовать любой из 25 цветов (необязательно использовать те же 25 цветов в оригинальном).