Bitmaps
Растровое изображение (BMP) - это, по сути, то, что вы описываете, массив чисел, представляющих цвета пикселей. Например, что-то вроде
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Сжатие без потерь
Теперь давайте определим схему сжатия. В нашей схеме сжатия у нас будет массив пар чисел. Например
3, 1, 1, 0, 7, 1
Теперь, первое, что я хочу отметить, это то, что эта схема сжатия представляет те же пиксели, что и первый массив. Первый массив имеет три единицы, за которыми следует один 0, а затем семь единиц. И это то, что мы представляем здесь. Этот формат короче, поскольку представляет несколько пикселей с двумя числами. Растровый формат должен использовать один номер для каждого пикселя.
Очевидно, что это несколько упрощенный вид изображения (например, всего одна строка) и схема сжатия. Но, надеюсь, это позволит вам увидеть, как схема сжатия меняет формат изображения. Вот как GIF относится к BMP. GIF использует схему сжатия под названием Lempel-Ziv-Welch вместо упрощенной.
Мы описали здесь схему сжатия без потерь. Проблема со схемами сжатия без потерь состоит в том, что для некоторых входов закодированная форма может быть длиннее, чем оригинал. Например, для
1, 0, 1, 0, 1
Кодировка
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Ну, это было бесполезно. Мы сделали вклад в два раза дольше.
Еще одно сжатие без потерь
Теперь давайте рассмотрим другую схему сжатия. В этом мы представим изображение в виде наложенных кругов. Для каждого круга мы определим центр, радиус и цвет.
Нашим первым растровым изображением станет
5, 5, 1, 3, 0, 0
Это та же длина, что и у нашего первого метода сжатия.
И наш второй может быть либо
2, 2, 1, 2, 1, 0, 2, 0, 1
Это три круга с центром в среднем элементе (который в подсчете компьютеров является номером 2, так как компьютеры начинают считать в 0). Один круг имеет радиус 2 и цвет 1. Затем мы добавляем круг цвета 0 и радиуса 1. Наконец, у нас есть круг цвета 1 и радиуса 0. На этапах это будет
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
Или же
2, 2, 1, 1, 0, 0, 3, 0, 0
Это тот же начальный круг, но покрытый двумя точечными кругами. По шагам было бы
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Оба они на одну короче первой закодированной версии, но все же длиннее оригинальной.
Вы можете удивиться, почему я говорю о кругах, а не диапазонах. Основная причина в том, что круги ближе к тому, что используют реальные двухмерные изображения.
Сжатие с потерями
У нас также есть концепция схем сжатия с потерями. Эти схемы сжатия без потерь могут быть возвращены в исходный массив растровых изображений. Схемы сжатия с потерями могут быть необратимыми.
Давайте рассмотрим версию нашего круга с потерями. В этом мы будем использовать простое правило. Мы не будем хранить круги с радиусом меньше 1. Поэтому в наших последних двух кодировках вместо этого
2, 2, 1, 2, 1, 0
а также
2, 2, 1
которые преобразованы в пиксели снова
1, 0, 0, 0, 1
а также
1, 1, 1, 1, 1
Первая версия всего на один элемент длиннее оригинальной. Вторая версия короче. Оба действительны, поэтому алгоритм может свободно развивать оба и выбирать более короткий.
Мы описываем изображения с более строгими правилами как более низкого качества.
Это представление изображений в виде наложенных коллекций круглых форм аналогично тому, как работает формат Joint Photographic Experts Group или JPEG . Его формы - это эллипсы, а не круги, но идея похожа. Вместо нашего упрощенного метода он использует дискретное косинусное преобразование для кодирования изображений.
В отличие от GIF, JPEG на самом деле представляет собой другой способ представления изображения. GIF все еще пикселей. Они просто хранятся по-другому. JPEG это формы. Чтобы просмотреть JPEG, мы затем конвертируем фигуры в пиксели, потому что так работают экраны. Теоретически мы могли бы разработать экран, который бы не работал таким образом. Вместо пикселей он может создавать фигуры, чтобы лучше соответствовать формату JPEG. Конечно, этот экран не сможет отображать растровые изображения. Чтобы отобразить BMP или GIF, нам нужно конвертировать в JPEG.
Если вы конвертируете стандартный GIF, скажем, 300x300 пикселей, преобразуете его в JPEG и проверяете качество вниз, базовые формы, которые он использует, должны быть видны. Многие JPEG избегают этих артефактов, начиная с изображения с гораздо более высоким разрешением.
JPEG хорошо масштабируется, потому что это фигуры, а не пиксели. Поэтому, если вы начнете с изображения 8000x8000, преобразуете его в JPEG и отобразите его как изображение 300x300, большая часть потерянных деталей в любом случае была бы потеряна. Если сначала преобразовать растровое изображение 8000x8000 в растровое изображение 300x300, а затем в JPEG, результаты часто будут иметь более низкое качество.
MPEG
Мы говорили о неподвижных изображениях. В группе экспертов по движущимся изображениям или формате MPEG используется тот же тип сжатия, что и в JPEG, но также применяется и другое. В то время как простой способ сделать видео состоит в том, чтобы отправить последовательность неподвижных изображений, MPEG фактически отправляет кадр, за которым следует некоторое количество кадров, перечисляющих изменения и заканчивающихся конечным кадром. Поскольку большинство кадров аналогичны предыдущему, список изменений часто меньше, чем второе изображение.
Последовательность обычно не такая длинная, скажем, пять кадров. Но это помогает сделать поток меньше, чем он был бы.
Упрощения
Я много игнорировал. Мои изображения имеют только два цвета (1 бит), а не 256 8-битного изображения и, конечно, не 4 294 967 296 32-битного изображения. Обратите внимание, что даже для 8-битных изображений вы часто можете выбирать разные палитры для изображения. Таким образом, две 8-битные битовые карты с одинаковыми последовательностями могут представлять изображения, которые выглядят по-разному (одинаковой формы, но разных цветов)
Мои изображения одиночные, а не двухмерные. Большинство изображений будут иметь определенный размер строки, делая массивы двумерными.
Я вообще не пытался представлять фактические кодировки. Они намного сложнее, чем те, которые я использовал. Я сделал это, потому что хотел описать кодировки в этом посте. Я не уверен, что мог бы объяснить Лемпеля-Зива гораздо меньше, чем более сложное уточнение Лемпеля-Зива-Уэлча в одном ответе. И я не понимаю преобразований Фурье достаточно хорошо, чтобы объяснить их подробно.
Это очень упрощенная версия фактической обработки изображений. Тем не менее, я чувствую, что в дидактических целях это легче понять, чем более сложную реальность, но при этом затрагивать основные моменты.