что такое сжатие изображений
Как работает сжатие цифровой фотографии – базовые алгоритмы
Сжатие является большой проблемой, когда дело доходит до фотографий. Вы можете легко испортить большое изображение, сжимая его слишком много или слишком часто.
Если Вы будете понимать принципы сжатия цифровой фотографии, вы сможете правильно управлять им, чтобы удовлетворить потребности конкретного изображения.
Что такое сжатие файла
Сжатие используется для уменьшения размера любого файла на компьютере, включая файлы изображений. Файлы сжимаются, чтобы уменьшить их размер и облегчить их публикацию в Интернете. Однако, когда дело доходит до фотографий, сжатие не всегда полезно, потому что сжатие может повлиять на качество изображения.
Различные форматы файлов фотографий на камерах DSLR и компьютерах применяют разные уровни сжатия. Когда изображение сжимается – в камере или на компьютере – в файле остается меньше информации, а более мелкие детали цвета, контрастности и резкости могут вовсе исчезнуть.
С таким форматом сжатия, как в файле JPEG, вы можете поместить больше файлов на карту памяти, но при этом вы жертвуете качеством. Опытные фотографы избегают сжатия, снимая в формат RAW, в котором сжатие не применяется. Однако, для обычной фотографии сжатие в формате JPEG не является существенным недостатком.
Когда заметно сжатие
Разница в форматах сжатия может быть не заметна на ЖК-экране камеры или даже на мониторе компьютера. Это наиболее очевидно при печати изображения, особенно если оно увеличено. Слишком сильное сжатие может повлиять даже на качество печати размером 8×10 дюймов. Однако, если вы просто делитесь фотографией в социальных сетях, потери при сжатии не будут заметны.
Цифровая фотография значительно продвинулась в последние годы. Многие фотографы хотят использовать новейшие камеры с максимальным количеством мегапикселей и постоянно обновляются, чтобы использовать новейшие технологии. Однако, если те же фотографы не обращают внимания на сжатие в момент захвата изображения, они теряют качество, за которое заплатили.
Как работает цифровое сжатие
Цифровой датчик способен захватывать гораздо больше информации, чем может обработать человеческий глаз. Следовательно, некоторая часть этой информации может быть удалена во время сжатия, и зритель ничего не заметит.
Механизм сжатия ищет любые большие области повторяющихся цветов и удаляет некоторые повторяющиеся данные. Затем они восстанавливаются на изображении при распаковке файла.
Два типа сжатия изображений
Два типа сжатия – без потерь и с потерями, и они означают именно то, как звучит их название.
Советы по предотвращению проблем со сжатием
Любой фотограф может предпринять шаги, чтобы не потерять качество фотографии при сжатии.
Как сжать фотографию и сохранить качество
Каждый день активный пользователь сети Интернет сталкивается с огромным количеством фотографий: это и реклама, и новости, и просто общение с друзьями, которые хотят поделиться своими впечатлениями от какого-либо фото.
Люди загружают фотографии на странички в социальных сетях, на свои сайты, открывают темы на форумах, отправляют друзьям и родственникам с помощью электронной почты и т.д. Фотографии, сделанные на современные фотоаппараты, занимают много места на различных носителях информации.
Часто перед пользователями возникает вопрос: « как сжать фотографию? », потому как « большой вес » изображения является причиной следующих неудобств:
Чтобы таких проблем не возникало, нужно сжимать фотографии для интернета. Для личного пользования, то есть, просмотра на своем ПК или ноутбуке, это необязательно.
Сжатие фото онлайн
Сжать фотографию онлайн – это самый легкий и быстрый способ решения проблемы относительно того, что изображение слишком много весит. Для этого нужно зайти в онлайн-сервис, который ориентирован на сжатие фотографий: в основном, это уменьшение размера снимков за счет уменьшения расширения.
Ниже приведены несколько бесплатных онлайн-сервисов подобного рода:
Программы для сжатия фотографий
« Как сжать размер фотографии? » — такой вопрос частенько предстает перед начинающими фотографами, да и не только перед ними.
Самая большая ошибка – это попытка уменьшить фотографию, не меняя размер изображения, а жертвуя качеством снимка. Итогом таких действий является размытое изображение, которое не помещается в экране. Для получения хорошей картинки с маленьким весом можно воспользоваться самым простым графическим редактором под названием Paint :
Уменьшить размер изображения в paint не составит труда, если выполнить следующие действия:
Также уменьшить вес фотографии можно в профессиональном графическом редакторе Photoshop :
Для уменьшения веса необходимо:
Советы по сжатию изображений
Как сжать фотографии для отправки по электронной почте или просто для размещения в сети Интернет? Как было сказано выше, перед отправкой необходимо уменьшить вес изображений. Выполняя сжатие, желательно придерживаться следующих правил:
Сжимаем много
Как сжать сразу несколько фотографий? Нередко возникает необходимость отправить кому-либо большое количество фотографий или просто разместить их на сайте. Естественно, для начала вес фото необходимо оптимизировать. Сделать это можно как онлайн, так и пользуясь программами, установленными на ПК или ноутбуке.
Для более качественной обработки фотографий лучше использовать приложения, которые устанавливаются на ваш компьютер. Примером такой программы является Picture Combine — данный графический редактор позволяет проводить пакетную оптимизацию фотографий. Программа проста в использовании, поэтому овладеть ей сможет каждый:
Как сжать несколько фотографий в фотошопе
В фотошопе также есть возможность сжать несколько фотографий одновременно. Для этого необходимо создать action – алгоритм действий для пакетной обработки фотографий.
Ниже описаны шаги по созданию подобного алгоритма:
Сжимаем целую папку
Как сжать папку с фотографиями? Такой вопрос возникает обычно тогда, когда необходимо сохранить фотографии на носителе, имеющем маленькую емкость, например, на флэшке. Или же, когда нужно отправить большое количество фотографий по электронной почте.
Для решения данной задачи лучше всего воспользоваться архиватором, который уменьшит вес папки ( от 20 до 75 процентов ). Самым распространенным архиватором является WinRar :
Для того чтобы сжать папку, необходимо кликнуть по ней правой кнопкой мыши и выбрать пункт « Добавить в архив ». Откроется окно с параметрами, в котором можно выбрать метод сжатия и формат архива, после чего нужно нажать « Ок » — начнется процесс сжатия.
Размер и вес изображения имеют большое значение при его размещении в интернете, поэтому необходимо уметь пользоваться средствами для оптимизации фотографий.
Простым языком о том, как работает сжатие файлов
Авторизуйтесь
Простым языком о том, как работает сжатие файлов
Сжатие файлов позволяет быстрее передавать, получать и хранить большие файлы. Оно используется повсеместно и наверняка хорошая вам знакомо: самые популярные расширения сжатых файлов — ZIP, JPEG и MP3. В этой статье кратко рассмотрим основные виды сжатия файлов и принципы их работы.
Что такое сжатие?
Сжатие файла — это уменьшение его размера при сохранении исходных данных. В этом случае файл занимает меньше места на устройстве, что также облегчает его хранение и передачу через интернет или другим способом. Важно отметить, что сжатие не безгранично и обычно делится на два основных типа: с потерями и без потерь. Рассмотрим каждый из них по отдельности.
Сжатие с потерями
Такой способ уменьшает размер файла, удаляя ненужные биты информации. Чаще всего встречается в форматах изображений, видео и аудио, где нет необходимости в идеальном представлении исходного медиа. MP3 и JPEG — два популярных примера. Но сжатие с потерями не совсем подходит для файлов, где важна вся информация. Например, в текстовом файле или электронной таблице оно приведёт к искажённому выводу.
MP3 содержит не всю аудиоинформацию из оригинальной записи. Этот формат исключает некоторые звуки, которые люди не слышат. Вы заметите, что они пропали, только на профессиональном оборудовании с очень высоким качеством звука, поэтому для обычного использования удаление этой информации позволит уменьшить размер файла практически без недостатков.
Аналогично файлы JPEG удаляют некритичные части изображений. Например, в изображении с голубым небом сжатие JPEG может изменить все пиксели на один или два оттенка синего вместо десятков.
Чем сильнее вы сжимаете файл, тем заметнее становится снижение качества. Вы, вероятно, замечали такое, слушая некачественную музыку в формате MP3, загруженную на YouTube. Например, сравните музыкальный трек высокого качества с сильно сжатой версией той же песни.
Сжатие с потерями подходит, когда файл содержит больше информации, чем нужно для ваших целей. Например, у вас есть огромный файл с исходным (RAW) изображением. Целесообразно сохранить это качество для печати изображения на большом баннере, но загружать исходный файл в Facebook будет бессмысленно. Картинка содержит множество данных, не заметных при просмотре в социальных сетях. Сжатие картинки в высококачественный JPEG исключает некоторую информацию, но изображение выглядит почти как оригинал.
При сохранении в формате с потерями, вы зачастую можете установить уровень качества. Например, у многих графических редакторов есть ползунок для выбора качества JPEG от 0 до 100. Экономия на уровне 90 или 80 процентов приводит к небольшому уменьшению размера файла с незначительной визуальной разницей. Но сохранение в плохом качестве или повторное сохранение одного и того же файла в формате с потерями ухудшит его.
Посмотрите на этот пример.
Оригинальное изображение, загруженное с Pixabay в формате JPEG. 874 КБ:
Результат сохранения в формате JPEG с 50-процентным качеством. Выглядит не так уж плохо. Вы можете заметить артефакты по краям коробок только при увеличении. 310 КБ:
Исходное изображение, сохранённое в формате JPEG с 10-процентным качеством. Выглядит ужасно. 100 КБ:
Где используется сжатие с потерями
Как мы уже упоминали, сжатие с потерями отлично подходит для большинства медиафайлов. Это крайне важно для таких компаний как Spotify и Netflix, которые постоянно транслируют большие объёмы информации. Максимальное уменьшение размера файла при сохранении качества делает их работу более эффективной.
Сжатие без потерь
Сжатие без потерь позволяет уменьшить размер файла так, чтобы в дальнейшем можно было восстановить первоначальное качество. В отличие от сжатия с потерями, этот способ не удаляет никакую информацию. Рассмотрим простой пример. На картинке ниже стопка из 10 кирпичей: два синих, пять жёлтых и три красных.
Вместо того чтобы показывать все 10 блоков, мы можем удалить все кирпичи одного цвета, кроме одного. Используя цифры, чтобы показать, сколько кирпичей каждого цвета было, мы представляем те же данные используя гораздо меньше кирпичей — три вместо десяти.
Это простая иллюстрация того, как осуществить сжатие без потерь. Та же информация сохраняется более эффективным способом. Рассмотрим реальный файл: mmmmmuuuuuuuoooooooooooo. Его можно сжать до гораздо более короткой формы: m5u7o12. Это позволяет использовать 7 символов вместо 24 для представления одних и тех же данных.
Где используется сжатие без потерь
ZIP-файлы — популярный пример сжатия без потерь. Хранить информацию в виде ZIP-файлов более эффективно, при этом когда вы распаковываете архив, там присутствует вся оригинальная информация. Это актуально для исполняемых файлов, так как после сжатия с потерями распакованная версия будет повреждена и непригодна для использования.
Другие распространённые форматы без потерь — PNG для изображений и FLAC для аудио. Форматы видео без потерь встречаются редко, потому что они занимают много места.
Сжатие с потерями vs сжатие без потерь
Теперь, когда мы рассмотрели обе формы сжатия файлов, может возникнуть вопрос, когда и какую следует использовать. Здесь всё зависит от того, для чего вы используете файлы.
Скажем, вы только что откопали свою старую коллекцию компакт-дисков и хотите оцифровать её. Когда вы копируете свои компакт-диски, имеет смысл использовать формат FLAC, формат без потерь. Это позволяет получить мастер-копию на компьютере, которая обладает тем же качеством звука, что и оригинальный компакт-диск.
Позже вы, возможно, захотите загрузить музыку на телефон или старый MP3-плеер. Здесь не так важно, чтобы музыка была в идеальном качестве, поэтому вы можете конвертировать файлы FLAC в MP3. Это даст вам аудиофайл, который по-прежнему достаточно хорош для прослушивания, но не занимает много места на мобильном устройстве. Качество MP3, преобразованного из FLAC, будет таким же, как если бы вы создали сжатый MP3 с оригинального CD.
Тип данных, представленных в файле, также может определять, какой вид сжатия подходит больше. В PNG используется сжатие без потерь, поэтому его хорошо использовать для изображений, в которых много однотонного пространства. Например, для скриншотов. Но PNG занимает гораздо больше места, когда картинка состоит из смеси множества цветов, как в случае с фотографиями. В этом случае с точки зрения размера файлов лучше использовать JPEG.
Проблемы во время сжатия файлов
Бесполезно конвертировать формат с потерями в формат без потерь. Это пустая трата пространства. Скажем, у вас есть MP3-файл весом в 3 МБ. Преобразование его в FLAC может привести к увеличению размера до 30 МБ. Но эти 30 МБ содержат только те звуки, которые имел уже сжатый MP3. Качество звука от этого не улучшится, но объём станет больше.
Также стоит иметь в виду, что преобразовывая один формат с потерями в аналогичный, вы получаете дальнейшее снижение качества. Каждый раз, когда вы применяете сжатие с потерями, вы теряете больше деталей. Это становится всё более и более заметно, пока файл по существу не будет разрушен. Помните также, что форматы с потерями удаляют некоторые данные и их невозможно восстановить.
Заключение
Мы рассмотрели как сжатие файлов с потерями, так и без потерь, чтобы увидеть, как они работают. Теперь вы знаете, как можно уменьшить размер файла и как выбрать лучший способ для этого.
Алгоритмы, которые определяют, какие данные выбрасываются в методах с потерями и как лучше хранить избыточные данные при сжатии без потерь, намного сложнее, чем описано здесь. На эту тему можно почитать больше информации здесь, если вам интересно.
Сжатие изображений без потерь
Метод кодирования длин серий
Наиболее простым для понимания алгоритмом является разработанный в 1950-х годах алгоритм кодирования длин серий. Основная идея алгоритма заключается в представлении каждой строки бинарного изображения в виде последовательности длин непрерывных групп чёрных и белых пикселей. Например, вторая строка изображения, приведённого на Рис. 1, будет выглядеть следующим образом: 2,3,2. Но в процессе декодирования возникнет неоднозначность, т.к. непонятно, какую серию: чёрную или белую кодирует первое число. Для решения этой проблемы существует два очевидных метода: либо для каждой строки предварительно указывать значение первого пиксела, либо договориться, что для каждой строки сначала указывается длина последовательности белых пикселов (при этом она может быть равна нулю).
Метод кодирования длин серий весьма эффективен, особенно для изображений с простой структурой, но этот метод может быть значительно улучшен, если дополнительно сжимать полученные последовательности каким-нибудь энтропийным алгоритмом, например, методом Хаффмана. Кроме того, энтропийный алгоритм может независимо применяться отдельно для чёрных и белых последовательностей, что ещё сильнее увеличит степень сжатия.
Метод кодирования контуров
Дальнейшим развитием идеи кодирования длин серий является метод сжатия с отслеживания контуров. Этот метод основан на использовании высокоуровневых свойств сжимаемого изображения. Т.е. изображение воспринимается не просто как набор пикселов, а как объекты переднего плана и фон. Сжатие выполняется за счёт эффективного представления объектов. Существуют различные способы представления, которые мы рассмотрим далее на примере Рис. 2.
Прежде всего надо отметить, что описание каждого объекта должно быть заключено в специальные сообщения (теги) начала и конца объекта. Первый и самый простой способ – указывать координаты начальной и конечной точки контура на каждой строке. Изображение на Рис. 2 будет закодировано следующим образом:
Эффективность дельта кодирования объясняется тем, что значения смещений по модулю близки к нулю и при большом количестве объектов в их описании будет много нулевых и близких к нулю значений. Преобразованные таким образом данные будут гораздо лучше сжиматься энтропийными алгоритмами.
Кодирование областей постоянства
Заканчивая разговор о сжатии двоичных изображений, необходимо упомянуть о ещё одном методе – кодировании областей постоянства. В этом методе изображение разбивается на прямоугольник n1*n2 пикселов. Все полученные прямоугольники делятся на три группы: полностью белые, полностью чёрные и смешанные. Самая распространённая категория кодируется однобитовым кодовым словом, а остальные две категории получают коды из двух бит. При этом код смешанной области служит меткой, после которой идёт n1*n2 бит, описывающих прямоугольник. Если разбить хорошо известное изображение с Рис. 2 на квадраты 2*2 пиксела, то получится пять белых квадратов, шесть чёрных и 13 смешанных. Договоримся 0 обозначать метку смешанного квадрата, 11 – метку белого квадрата, а 10 – метку чёрного квадрата, единичный белый пиксел будем кодировать 1, а чёрный, соответственно, 0. Тогда всё изображение будет закодировано следующим образом (жирным выделены метки):
Как и у большинства методов сжатия, эффективность этого метода тем выше, чем больше исходное изображение. Кроме того, можно заметить, что значения смешанных квадратов могут быть весьма эффективно сжаты словарными алгоритмами.
На этом мы закончим рассказ о сжатии двоичных изображений и перейдём к рассказу о сжатии без потерь полноцветных и монохромных изображений.
Сжатие монохромных и полноцветных изображений
Существует множество различных подходов к сжатию изображений без потерь. Самые тривиальные сводятся к прямому применению алгоритмов, рассмотренных постом ранее, другие более совершенные алгоритмы используют информацию о типе сжимаемых данных.
Кодирование битовых плоскостей
Первым способом, который мы рассмотрим, будет способ, известный как кодирование битовых плоскостей. Рассмотрим произвольное изображение с n уровнями яркости. Очевидно, что эти уровни могут быть представлены с помощью log2n бит. Метод разложения на битовые плоскости заключается в разделении одного изображения с n уровнями яркости на log2n бинарных изображений. При этом i-ое изображение получается путём выделения i-ых битов из каждого пиксела исходного изображения. В Табл. 1 показано разложение исходного изображения по битовым плоскостям.
После разложения изображения на битовые плоскости каждое полученное изображение можно сжать, используя рассмотренные ранее методы сжатия двоичных изображений.
Довольно очевидным недостатком данного подхода является эффект многократного переноса разрядов при незначительном изменении яркости. Например, при изменении яркости со 127 на 128 произойдёт изменение значений всех двоичных разрядов (0111111→10000000), что вызовет изменение всех битовых плоскостей.
Чтобы снизить негативные последствия от многократных переносов, на практике часто используются специальные коды, например коды Грея, в которых два соседних элемента различаются только в одном разряде. Для перевода n-битного числа в код Грея необходимо выполнить операцию побитового исключающего ИЛИ с этим же числом, сдвинутым на один бит вправо. Обратное преобразование из кода Грея можно осуществить, выполняя побитовую операцию исключающего ИЛИ для всех сдвигов исходного числа, не равных нулю. Алгоритмы преобразования в код Грея и из него приведены в Листинг 1.
function BinToGray ( BinValue : byte ) : byte ;
begin
BinToGray : = BinValue xor ( BinValue shr 1 ) ;
end ;
function GrayToBin ( GrayValue : byte ) : byte ;
var
BinValue : integer ;
begin
BinValue : = 0 ;
while GrayValue > 0 do
begin
BinValue : = BinValue xor GrayValue ;
GrayValue : = GrayValue shr 1 ;
end ;
GrayToBin : = BinValue ;
end ;
Легко убедиться, что после преобразования в код Грея при смене яркости со 127 на 128 меняется только один двоичный разряд:
Битовые плоскости, полученные с помощью кода Грея, более монотонны и в общем случае лучше поддаются сжатию. В Табл. 2 показаны битовые плоскости, полученные из исходного изображения, и изображения, преобразованного в код Грея:
Кодирование с предсказанием
В основе кодирования с предсказанием лежит идея, похожая на алгоритм дельта кодирования. Большинство реальных изображений локально однородны, т.е. соседи пиксела имеют примерно ту же яркость, что и сам пиксел. Это условие не выполняется на границах объектов, но для большей части изображения оно верно. Исходя из этого можно предсказать значение яркости пиксела, основываясь на яркости соседей. Разумеется, это предсказание не будет абсолютно точным, и будет возникать ошибка предсказания. Именно эта ошибка предсказания в дальнейшем кодируется с помощью энтропийных алгоритмов. Эффективность кодирования обеспечивается за счёт уже упомянутого свойства локальной однородности: на большей части изображения значение ошибки по модулю будет близко к нулю.
При этом способе кодирования очень важно, чтобы и при кодировании, и при декодировании использовался один и тот же предсказатель. В общем случае предсказатель может использовать любые характеристики изображения, но на практике предсказанное значение чаще всего вычисляется как линейная комбинация яркостей соседей: pk=∑i=1 M αi*pk-i. В этой формуле M – число соседей, участвующих в предсказании (порядок предсказания), индексы p — номера пикселей в порядке их просмотра. Можно заметить, что при M=1 кодирование с предсказанием превращается в рассмотренное ранее дельта кодирование (правда, вместо разницы координат теперь кодируется разность яркостей).
Тут необходимо немного обсудить порядок просмотра пикселей. До этого момента мы предполагали, что пикселы просматриваются слева направо и сверху вниз, т.е. в порядке обхода строками(Табл. 3):
Но очевидно, что результат предсказания яркости пятого пиксела на основе четвёртого (при обходе строками) будет очень далёк от истинного результата. Поэтому на практике часто используют другие порядки обхода, например, обход строками с разворотом, змейкой, полосами, полосами с разворотом, и т.д. Некоторые из перечисленных вариантов обхода приведены в Табл. 4
Рассмотрим описанный метод на конкретном примере. Попробуем применить кодирование с предсказанием для изображения Останкинской телебашни на Рис. 3
Для простоты будем использовать предсказание первого порядка (дельта кодирование) и обход по строкам (каждую строку будем кодировать независимо). При программной реализации необходимо решить, как передавать информацию о первых M пикселах, значение которых невозможно предсказать. В реализации Листинг 2 используется следующий подход: первый пиксел каждой строки кодируется непосредственно значением своей яркости, а все последующие пикселы в строке предсказываются на основе одного предыдущего.
В Табл. 5 представлен результат работы данного алгоритма. Белым цветом показаны пикселы, предсказанные точно, а ошибки отмечены цветом, причём положительное значение ошибки отображается красным цветом, а отрицательное – зелёным. Интенсивность цвета соответствует модулю величины ошибки.
Анализ показывает, что подобная реализация обеспечивает среднюю ошибку предсказания всего в 0.21 уровня яркости. Использование предсказаний более высокого порядка и других способов обхода позволяет ещё сильнее уменьшить ошибку предсказания, а значит, увеличить степень сжатия.