Почему компьютерная графика почти всегда используется в сжатом виде

Обновлено: 30.06.2024

Раздел 404 Закона Сарбейнса-Оксли (SOX) требует, чтобы все публичные компании установили внутренний контроль и процедуры.

Закон о защите конфиденциальности детей в Интернете от 1998 года (COPPA) – это федеральный закон, который налагает особые требования на операторов доменов .

План North American Electric Reliability Corporation по защите критически важной инфраструктуры (NERC CIP) представляет собой набор стандартов.

Стандарт безопасности данных платежных приложений (PA-DSS) – это набор требований, призванных помочь поставщикам программного обеспечения в разработке безопасных .

Взаимная аутентификация, также называемая двусторонней аутентификацией, представляет собой процесс или технологию, в которой оба объекта обмениваются данными .

Экранированная подсеть или брандмауэр с тройным подключением относится к сетевой архитектуре, в которой один брандмауэр используется с тремя сетями .

Медицинская транскрипция (МТ) – это ручная обработка голосовых сообщений, продиктованных врачами и другими медицинскими работниками.

Электронное отделение интенсивной терапии (eICU) — это форма или модель телемедицины, в которой используются самые современные технологии.

Защищенная медицинская информация (PHI), также называемая личной медицинской информацией, представляет собой демографическую информацию, медицинскую .

Снижение рисков – это стратегия подготовки к угрозам, с которыми сталкивается бизнес, и уменьшения их последствий.

Отказоустойчивая технология — это способность компьютерной системы, электронной системы или сети обеспечивать бесперебойное обслуживание.

Синхронная репликация — это процесс копирования данных по сети хранения, локальной или глобальной сети, поэтому .

Коэффициент усиления записи (WAF) – это числовое значение, представляющее объем данных, передаваемых контроллером твердотельного накопителя (SSD) .

API облачного хранилища — это интерфейс прикладного программирования, который соединяет локальное приложение с облачным хранилищем.

Интерфейс управления облачными данными (CDMI) – это международный стандарт, определяющий функциональный интерфейс, используемый приложениями.

Основное внимание в этой книге уделяется трехмерной (3D) графике, где большая часть работы уходит на создание трехмерной модели сцены. Но в конечном итоге почти во всех случаях конечным результатом проекта компьютерной графики является двумерное изображение. И, конечно же, непосредственное создание и обработка 2D-изображений сама по себе является важной темой. Кроме того, многие идеи переносятся из двух измерений в трехмерные. Итак, имеет смысл начать с графики в 2D.

В любом случае значения цвета для всех пикселей на экране хранятся в большом блоке памяти, известном как кадровый буфер. Изменение изображения на экране требует изменения значений цвета, которые хранятся в буфере кадра. Экран перерисовывается много раз в секунду, так что почти сразу после изменения значений цвета в буфере кадра цвета пикселей на экране будут изменены в соответствии с ними, и отображаемое изображение изменится.

Экран компьютера, используемый таким образом, является базовой моделью растровой графики. Термин «растр» технически относится к механизму, используемому в старых компьютерных мониторах с электронными лампами: электронный луч перемещался по рядам пикселей, заставляя их светиться. Луч перемещался по экрану с помощью мощных магнитов, которые отклоняли траекторию движения электронов. Чем сильнее луч, тем ярче свечение пикселя, поэтому яркостью пикселей можно было управлять, модулируя интенсивность электронного луча. Значения цвета, хранящиеся в буфере кадров, использовались для определения интенсивности электронного луча. (Для цветного экрана каждый пиксель имел красную точку, зеленую точку и синюю точку, которые освещались лучом по отдельности.)

Современный компьютерный монитор с плоским экраном не является растровым в том же смысле. Нет движущегося электронного луча. Механизм, управляющий цветами пикселей, отличается для разных типов экранов. Но экран по-прежнему состоит из пикселей, и значения цвета для всех пикселей по-прежнему хранятся в буфере кадра. Идея изображения, состоящего из сетки пикселей с числовыми значениями цвета для каждого пикселя, определяет растровую графику.

Хотя изображения на экране компьютера представлены в пикселях, указание цвета отдельных пикселей не всегда является лучшим способом создания изображения. Другой способ — указать основные геометрические объекты, которые он содержит, такие формы, как линии, круги, треугольники и прямоугольники. Это идея, которая определяет векторную графику: представление изображения в виде списка геометрических фигур, которые оно содержит. Чтобы сделать вещи более интересными, фигуры могут иметь атрибуты, такие как толщина линии или цвет, заполняющий прямоугольник. Конечно, не каждое изображение можно составить из простых геометрических фигур. Этот подход определенно не сработает для изображения красивого заката (или для большинства других фотографических изображений).Однако он хорошо подходит для многих типов изображений, таких как архитектурные чертежи и научные иллюстрации.

На самом деле, в начале истории вычислений векторная графика использовалась даже непосредственно на экранах компьютеров. Когда были разработаны первые графические компьютерные дисплеи, растровые дисплеи были слишком медленными и дорогими, чтобы их можно было использовать. К счастью, можно было использовать технологию электронных ламп по-другому: электронный луч можно было заставить непосредственно рисовать линию на экране, просто проводя лучом вдоль этой линии. Дисплей с векторной графикой будет хранить список строк, которые должны отображаться на экране. Поскольку точка на экране после освещения электронным лучом будет светиться лишь очень короткое время, графический дисплей будет снова и снова просматривать список отображения, постоянно перерисовывая все строки в списке. Чтобы изменить изображение, достаточно было бы изменить содержимое списка отображения. Конечно, если список отображения станет слишком длинным, изображение начнет мерцать, потому что линия может заметно исчезнуть до того, как ее следующий ход будет перерисован.

Но вот в чем суть: для изображения, которое может быть задано как достаточно небольшое количество геометрических фигур, объем информации, необходимой для представления изображения, намного меньше при использовании векторного представления, чем при использовании растрового представления. Рассмотрим изображение, состоящее из тысячи отрезков. Для векторного представления изображения вам нужно только сохранить координаты двух тысяч точек, конечных точек линий. Это займет всего несколько килобайт памяти. Для сохранения изображения в кадровом буфере для растрового отображения потребуется гораздо больше памяти. Точно так же векторный дисплей может рисовать линии на экране быстрее, чем растровый дисплей может копировать то же изображение из кадрового буфера на экран. (Однако, как только растровые дисплеи стали быстрыми и дешевыми, они быстро вытеснили векторные дисплеи из-за их способности достаточно хорошо отображать все типы изображений.)

Разрыв между растровой и векторной графикой сохраняется в нескольких областях компьютерной графики. Например, это можно увидеть в разделении между двумя категориями программ, которые можно использовать для создания изображений: программы рисования и программы рисования. В программе рисования изображение представлено в виде сетки пикселей, и пользователь создает изображение, назначая цвета пикселям. Это можно сделать с помощью «инструмента рисования», который действует как кисть художника, или даже с помощью инструментов, которые рисуют геометрические фигуры, такие как линии или прямоугольники. Но суть программы рисования заключается в том, чтобы раскрашивать отдельные пиксели, и сохраняются только цвета пикселей. Чтобы было понятнее, предположим, что вы используете программу для рисования, чтобы нарисовать дом, а затем нарисовать дерево перед домом. Если вы затем сотрете дерево, вы обнаружите только пустой фон, а не дом. На самом деле изображение вообще не содержало «дома» — только отдельные цветные пиксели, которые зритель мог воспринимать как составляющие изображение дома.

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

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

Двумя широко известными графическими программами являются Adobe Photoshop и Adobe Illustrator. Photoshop относится к категории программ для рисования, а Illustrator больше подходит для рисования. В мире бесплатного программного обеспечения программа обработки изображений GNU, Gimp, является хорошей альтернативой Photoshop, а Inkscape — довольно эффективная программа. бесплатная программа для рисования. Краткое введение в Gimp и Inkscape можно найти в Приложении C.

Разница между растровой и векторной графикой проявляется и в форматах графических файлов.Существует множество способов представления изображения в виде данных, хранящихся в файле. Если исходное изображение должно быть восстановлено из битов, хранящихся в файле, представление должно соответствовать какой-то точной известной спецификации. Такая спецификация называется форматом графического файла. Некоторые популярные форматы графических файлов включают GIF, PNG, JPEG, WebP и SVG. Большинство изображений, используемых в Интернете, имеют формат GIF, PNG или JPEG, но большинство браузеров также поддерживают изображения SVG и более новый формат WebP.

GIF, PNG, JPEG и WebP в основном представляют собой форматы растровой графики. изображение определяется путем сохранения значения цвета для каждого пикселя. GIF — это более старый формат файла, который в значительной степени был вытеснен PNG, но вы все еще можете найти изображения GIF в Интернете. (Формат GIF поддерживает анимированные изображения, поэтому GIF часто используются для простой анимации на веб-страницах.) GIF использует индексированную цветовую модель с максимальным количеством цветов 256. PNG может использовать как индексированный, так и полный 24-битный цвет, а JPEG предназначен для полноцветных изображений.

Объем данных, необходимых для представления растрового изображения, может быть довольно большим. Однако данные обычно содержат много избыточности, и данные можно «сжать», чтобы уменьшить их размер. GIF и PNG используют сжатие данных без потерь, что означает, что исходное изображение может быть полностью восстановлено из сжатых данных. JPEG использует алгоритм сжатия данных с потерями, что означает, что изображение, восстановленное из файла JPEG, не совсем совпадает с исходным изображением; часть информации утеряна. Это может показаться не очень хорошей идеей, но на самом деле разница часто не очень заметна, а использование сжатия с потерями обычно позволяет значительно уменьшить размер сжатых данных. JPEG обычно хорошо подходит для фотографических изображений, но не так хорошо для изображений с резкими границами между разными цветами. Это особенно плохо для штриховых рисунков и изображений, содержащих текст; PNG является предпочтительным форматом для таких изображений. WebP может использовать как сжатие без потерь, так и сжатие с потерями.

SVG, с другой стороны, по своей сути является форматом векторной графики (хотя изображения SVG могут включать растровые изображения). SVG на самом деле представляет собой основанный на XML язык для описания двумерных изображений векторной графики. «SVG» означает «масштабируемая векторная графика», а термин «масштабируемый» указывает на одно из преимуществ векторной графики: при увеличении размера изображения не происходит потери качества. Линия между двумя точками может быть представлена ​​в любом масштабе, и это все та же идеальная геометрическая линия. С другой стороны, если вы попытаетесь значительно увеличить размер растрового изображения, вы обнаружите, что у вас недостаточно значений цвета для всех пикселей в новом изображении; каждый пиксель исходного изображения будет расширен, чтобы покрыть прямоугольник пикселей в масштабированном изображении, и вы получите многопиксельные блоки однородного цвета. Масштабируемость изображений SVG делает их хорошим выбором для веб-браузеров и графических элементов на рабочем столе вашего компьютера. И действительно, некоторые среды рабочего стола теперь используют изображения SVG для своих значков на рабочем столе.

Цифровое изображение, независимо от его формата, задается с помощью системы координат. Система координат устанавливает соответствие между числами и геометрическими точками. В двух измерениях каждой точке присваивается пара чисел, которые называются координатами точки. Две координаты точки часто называют ее координатой x и координатой y, хотя имена «x» и «y» произвольны.

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

Для векторного изображения естественно использовать действительные координаты. Система координат для изображения в некоторой степени произвольна; то есть одно и то же изображение может быть указано с использованием разных систем координат. Я не хочу много говорить здесь о системах координат, но им будет посвящена большая часть книги, и они даже более важны в трехмерной графике, чем в двухмерной.

Существует 5 основных форматов для хранения изображений. Почему вы предпочли бы одно, а не другое, и в чем разница?

<р>1. TIFF (также известный как TIF), типы файлов, оканчивающиеся на .tif

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

TIFF — это наиболее распространенный тип файлов, используемый в программах для работы с фотографиями (таких как Photoshop), а также в программах для верстки страниц (таких как Quark и InDesign), опять же, потому что TIFF содержит много графических данных.

<р>2. JPEG (также известный как JPG), типы файлов, оканчивающиеся на .jpg

JPEG означает Объединенную группу экспертов по фотографии, которая создала этот стандарт для этого типа форматирования изображений. Файлы JPEG — это изображения, которые были сжаты для хранения большого количества информации в файле небольшого размера. Большинство цифровых камер сохраняют фотографии в формате JPEG, потому что в этом случае на одну карту камеры можно сделать больше фотографий, чем в других форматах.

Файл JPEG сжимается таким образом, что при сжатии теряется часть деталей изображения, чтобы сделать файл маленьким (поэтому это называется сжатием с потерями).

Файлы JPEG обычно используются для фотографий в Интернете, поскольку они создают небольшой файл, который легко загружается на веб-страницу и хорошо выглядит.

Файлы JPEG плохо подходят для штриховых рисунков, логотипов или графики, так как сжатие делает их «битовыми» (зубчатые линии вместо прямых).

<р>3. GIF, типы файлов, оканчивающиеся на .jpg

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

GIF-файлы также имеют чрезвычайно ограниченный цветовой диапазон, подходящий для Интернета, но не для печати. Этот формат никогда не используется для фотографии из-за ограниченного количества цветов. GIF также можно использовать для анимации.

<р>4. PNG, типы файлов, заканчивающиеся на .jpg

PNG означает переносимую сетевую графику. Он был создан как открытый формат для замены GIF, потому что патент на GIF принадлежал одной компании, и никто другой не хотел платить лицензионные сборы. Это также обеспечивает полный диапазон цветов и лучшее сжатие.

Он используется почти исключительно для веб-изображений, а не для печатных изображений. Для фотографий PNG не так хорош, как JPEG, потому что он создает файл большего размера. Но для изображений с текстом или штриховой графикой это лучше, потому что изображения выглядят менее «растровыми».

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

<р>5. Необработанные файлы изображений

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

Файлы Raw обычно содержат большое количество несжатых данных. Из-за этого размер необработанного файла чрезвычайно велик. Обычно перед редактированием и цветокоррекцией они конвертируются в формат TIFF.

Большая часть этой информации любезно предоставлена ​​Википедией, которая является отличным местом, чтобы узнать больше обо всех 5 типах файлов.

Зарегистрировано в категории: Mac для дома, Mac для малого бизнеса, Советы по Mac, Технический дизайн
Теги статьи: gif, файлы изображений, изображения, jpeg, фотографии, png, raw, tiff
Комментарии: Комментарии отключены о 5 типах файлов цифровых изображений: TIFF, JPEG, GIF, PNG и файлах необработанных изображений, а также о том, когда использовать каждый из них




< img class="lazyload" data-src="https://www.iquilezles.org/imgPatreon.jpg" />




Введение

В 2002 году я провел несколько экспериментов по сжатию изображений с помощью вейвлетов. В 2007 году я решил вернуться к этой теме и провел несколько дней, играя и пытаясь понять, смогу ли я сделать с ней что-то полезное. В итоге у меня получилось небольшое демо под названием Inslexia, которое заняло 4-е (последнее!) место на демо-пати The Ultimate Meeting в Германии.

Как и многие другие методы сжатия, основанные на обработке сигналов, вейвлеты используют тот факт, что большинство сигналов для человека в основном гладкие. Это означает, что обычно значение образца (например, цвет пикселя) похоже на соседние образцы (например, цвет пикселей вокруг). Однако большинство методов сжатия на основе Фурье, таких как mp3 для звука или JPG для изображений, и даже методы без потерь, такие как PNG, используют эту гладкость только на очень простом уровне.Действительно, все эти методы делят сигнал (звук или изображение) на плитки сэмплов или пикселей (например, на группы 8x8 пикселей) и используют плавность только внутри этой области, не используя тот факт, что, возможно, сэмплы/пиксели похожи. за эти границы и в гораздо большем масштабе (подумайте о почти полностью голубом небе).

Вейвлет-сжатие позволяет нам использовать плавность на любом уровне, будь то крошечные группы сэмплов 2x2, будь то все пиксели плоского изображения одновременно. Таким образом, коэффициент сжатия дополнительно улучшается по сравнению с блочными методами. Это означает, что в тех случаях, когда требуется экстремальное сжатие, вейвлеты действительно могут превзойти традиционные методы.

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

Идея

Идея состоит в том, чтобы сначала начать с изображения в градациях серого и действовать так же, как если бы вы работали с компрессором изображений PNG: выберите свой буфер и сгруппируйте пиксели в плитки 2x2. Теперь, если вы сохраните только средний цвет четырех пикселей каждой плитки, вы уже сжимаете 1:4. Хорошо. Конечно, разрешение изображения уменьшилось. Давайте исправим это, компактно сохранив реальное значение 4 пикселей. Поскольку эти пиксели физически расположены близко друг к другу, мы можем с уверенностью предположить, что их цвета будут похожи на тот средний цвет, который мы уже закодировали. Итак, вместо того, чтобы хранить эти пиксели как полные значения шкалы серого, давайте сохраним только величину, на которую они отличаются от среднего цвета. На самом деле нам нужно хранить только три из них, потому что четвертый можно вывести из трех других, учитывая тот факт, что мы знаем, что они усредняются. Итак, давайте сохраним эти три значения (которые могут быть как положительными, так и отрицательными, но в любом случае небольшими) в отдельный массив, чтобы у нас был массив угловых пикселей для всего изображения и три массива различий для остальных пикселей. Эти три массива будут очень хорошо сжиматься, потому что они имеют небольшие значения, что будет тем более верным, чем больше разрешение изображения.

Теперь мы не останавливаемся здесь на PNG, но обратите внимание, что массив средних пикселей на самом деле является новым изображением, которое имеет одну четверть количества пикселей исходного изображения - это просто его версия с пониженной частотой дискретизации. Это означает, что мы можем просто повторить процесс, чтобы создать новую тройку значений деталей и новое среднее изображение, размер которого снова будет составлять четверть размера текущего изображения, совсем как в цепочке MIP-карт для текстур. Процесс можно повторять до тех пор, пока мы не получим изображение один пиксель за одним пикселем. Прелесть в том, что с помощью этого процесса мы перегруппировали данные изображения в группы или «полосы» различий в деталях (в группах по три), чтобы они имели смысл вместе. Поскольку массивы различий первой итерации соответствуют самой высокой частоте изображения (т. е. той, которая отделяет один пиксель от следующего), вторая полоса различий кодирует информацию половины этой частоты, т. е. вариации цвета, которые происходят каждые четыре пикселей, следующий диапазон работает на частоте 8 пикселей и т.д. Интуитивно мы можем видеть, что чем выше частота полосы, тем меньше будут различия, потому что, конечно, цвета, разделенные одним пикселем, гораздо больше похожи друг на друга, чем цвета, разделенные 8 пикселями.

По сути, получается некое частотное разложение изображения, но во всех масштабах, а не только в блочном масштабе 2x2, как в PNG, или 8x8, как в JPG. Теперь назовите числа/разности, хранящиеся в каждой полосе, «коэффициентами», и вы закончили с вейвлет-сжатием.

Подробности

Ну, не совсем так. Вейвлеты — это сложный инструмент обработки сигналов, и то, что мы здесь делаем, не что иное, как царапание самой поверхности. На самом деле, мы используем одну из многих возможных основ вейвлетов, точнее вейвлет Хаара. Но мы не будем здесь вдаваться в банки фильтров и все, что связано с DSP — вместо этого мы просто посмотрим, как я реализовал эту простую технику многоуровневого кодирования цвета и как мое изображение было сжато в моей демонстрации.

Мы собираемся заменить четыре пикселя плитки 2x2, которые мы можем назвать a, b, c и d, новыми значениями a', b', c' и d', так что a' является средним значением четыре пикселя, b' – это разница между b и средним значением a', c' – разница между c и средним значением a', и то же самое для d'.




Это можно переписать в матричной форме как


Отметим, что эта матрица не является ортогональной, а это означает, что выходной вектор (a', b', c' и d') будет иметь некоторую избыточную информацию в своих координатах. В основном a', b', c' и d' будут кодировать избыточную информацию о цвете. Итак, мы ортогонализируем матрицу, чтобы получить


что соответствует следующим операциям с пикселями:



Круто то, что эта матрица равна своей обратной (до масштабного коэффициента 1/4), поэтому во время декодирования можно подставить a', b', c' и d в матрицу и получить a, b, c и d обратно.

Поэтому сжатие начинается с перемещения изображения по группам 2x2 пикселей и вычисления a', b', c' и d'. Обход можно выполнить разными способами, но использование традиционного порядка растра (сверху вниз, слева направо) не является оптимальным. Чтобы взорвать локальную когерентность изображения, существуют гораздо лучшие альтернативы обхода. Например, обычно рекомендуется порядок Мортона, который выполняет рекурсивные (фрактальные) зигзаги:


// обратный порядок Мортона (используется во время распаковки) // (i,j) координаты пикселя, от 0 до (2^level)-1 // уровень: уровень итерации, log2(разрешение) int imorton( int i, int j, int level ) < int res = 0; for( int k=level-1; k>=0; k-- ) res = (res >k)&1) >k)&1); возврат рез; >

// порядок Мортона (используется во время сжатия) // i: индекс в последовательности // уровень: уровень итерации, log2(разрешение) // возвращает смещение в пикселях = v*разрешение+u int morton( int i, уровень int ) < int res = 0; for(int k=0; k >1)&1) >= 2; > вернуть рез; >

После того, как a', b', c' и d' вычислены, b', c' и d' должны быть сохранены в выходном файле/потоке/блоке данных. С другой стороны, a' должно сохраняться таким, чтобы все a' всех плиток вместе образовывали новое изображение, которое в два раза меньше в каждом измерении. Теперь нам нужно сжать это новое изображение половинного размера, используя один и тот же процесс, несколько раз, пока только один раз мы не получим изображение с одним единственным пикселем, после чего все изображение будет полностью закодировано.

Конечно, делая все это, мы не уменьшили объем данных. Но мы его переставили и декоррелировали. Это означает, что все коэффициенты b', c' и d', которые мы храним, на самом деле имеют очень предикативные значения. Например, на первой итерации/проходе эти коэффициенты будут иметь очень маленькие значения, вероятно, порядка ±4, потому что изображения обычно не имеют больших цветовых вариаций между соседними пикселями. Это означает, что мы можем хранить коэффициенты первого прохода с очень небольшим количеством битов, возможно, всего 2 или 3. Кроме того, и здесь начинается самое интересное, вы можете выбрать количественную оценку этих значений и отбросить те, которые достаточно малы, как вы бы это сделали. сделать в кодировщике JPG. Суть всех этих вейвлетов и рекурсивной обработки изображений в том, что в отличие от JPG здесь мы будем отбрасывать коэффициенты, которые достаточно малы при любом масштабе. Это то, что JPG не может сделать. Итак, это означает, что если у нас есть огромный участок синего цвета на небе, наш вейвлет-компрессор сможет хранить все это в паре значений данных, в то время как JPG должен хранить столько значений, сколько блоков 8x8 пикселей. подходит для патча.

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

С точки зрения реализации, поскольку вы будете манипулировать изображениями разных размеров, вы, вероятно, захотите выделить только два буфера размером с исходное изображение и повторно использовать их, переключаясь между уровнями.

// 512x512 декомпрессия изображения в градациях серого void ihaar( float **dstori, int level, const unsigned char *coeffs ) < const int res = 1 // пинг-понговые буферы назначения/происхождения между итерациями float *dst = dstori[ (1-й уровень) ]; float *ori = dstori[(level&1)^1]; for( int i=0; i >nivel; const int k = i & (res-1); const int m = imorton(k,j,level)*3; const float a = ori[i]; const float b = cte*(float)(coeffs[m+0]-128); const float c = cte*(float)(coeffs[m+1]-128); const float d = cte*(float)(coeffs[m +2]-128); dst[ (j*4+0)*res + k*2+0] = a + b + c + d; dst[ (j*4+0)*res + k*2+ 1 ] = a - b + c - d; dst[ (j*4+2)*res + k*2+0] = a + b - c - d; dst[ (j*4+2)*res + k*2+1 ] = a - b - c + d; > // рекурсия (от 512x512 до 1x1) if( level Пока у нас есть только сжатые изображения в градациях серого. Для цветных изображений мы будем использовать очень стандартный метод, который делает хранение цвета очень недорогим, почти бесплатно. Наивный подход разложения изображений RGB на три независимых изображения в оттенках серого - очень плохая идея, вы НИКОГДА не должны этого делать. Вместо этого мы собираемся использовать популярное разложение яркости / цветности, как JPG может.

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



исходное изображение (512 x 512 = 768 Кбайт необработанных данных)



яркость (512 x 512 = 262 КБ исходных данных)



цветность (512 x 512 = 524 КБ необработанных данных)



реконструированное изображение (512 x 512 = 264 КБ исходных данных)



яркость после передискретизации (32 x 32 = 2 Кбайт исходных данных)



Цветность с пониженной частотой дискретизации (32 x 32 = 2 КБ исходных данных)

На изображениях выше я уменьшаю цветность только до 32x32 пикселей, что довольно много. На самом деле трюк кажется фантастическим, реконструированное изображение довольно приемлемо по сравнению с оригиналом, но занимает одну треть размера (так же, как его версия в градациях серого). Вот несколько процедур для извлечения яркости Y и цветности U и V из обычные цвета RGB и наоборот. Есть много похожих формул преобразования цветов, которые одинаково хороши, если они разделяют яркость и цвет.

Размытие блоков

Дополнительное сжатие, достигаемое за счет жесткой количественной оценки коэффициентов детализации (b', c' и d'), приводит к появлению блочных артефактов (в отличие от сжатия изображений JPG, эти блоки не имеют постоянного размера, а появляются во всех размерах). Что-то, что, возможно, может улучшить качество изображения, - это размыть распакованный буфер, чтобы скрыть артефакты. Конечно, простое размытие удалит детали изображения. Так что адаптивное размытие может быть лучшим вариантом. Для Inslexia я решил использовать размытие по Гауссу, радионуклид ядра которого будет варьироваться в зависимости от дисперсии цветов RGB. Дисперсия остается низкой в ​​областях с низкой частотой и обычно увеличивается в областях с большим количеством текстуры. Поэтому его можно использовать в качестве своего рода детектора низкочастотного фронта. На следующих четырех изображениях изображение в верхнем левом углу показывает распакованное изображение, состоящее не более чем из 1300 байт! Изображение справа — это дисперсия этого изображения. Обратите внимание, как области с высокой дисперсией (выделены белым цветом) указывают нам на места, где мы не хотим слишком сильно размывать, или, другими словами, на области, где радиус размытия по Гауссу будет мал. Темные области, которые являются областями с низкой вариацией, могут использовать большое ядро ​​размытия по Гауссу для выполнения размытия. Результатом является нижнее левое изображение. Обратите внимание, насколько лучше оно выглядит по сравнению с изображением справа, на котором показано обычное слепое размытие по Гауссу, примененное к исходному распакованному изображению (например, обратите внимание на брови).



исходное изображение (1300 байт)



дисперсия



Размытие по Гауссу на основе дисперсии



обычное размытие по Гауссу

Читайте также: