Сжатие цветных картинок требует
предварительно разложения цвета на три составляющие. В обычной жизни часто
можно встретиться с простым разложением на три цвета: красный, синий и зелёный.
Такое разложение называется RGB:
Но при сжатии картинок, в частности, при JPG-сжатии, обычно используют другое разложение, называемое YCrCb. Y – это набор яркостей, который основывается по большей части на зелёном цвете, лучше всего воспринимаемом человеческим глазом. Наборы Cr и Cb хранят ключи для восстановления красного и синего цвета из Y. Использование разложения YCrCb позволяет сильнее сжимать изображение при меньших потерях качества, так как главная информация для человека в картинке – это именно информация о яркости отдельных точек. Составляющие Cr и Cb хорошо сжимаются, не внося сильных ухудшений в качество картинки, сами по себе они менее чёткие, чем Y:
Для сжатия изображений используется Wavelet-преобразование. Главная цель этого преобразования – изменить последовательность цветов (или яркостей) таким образом, чтобы в этой последовательности было как можно больше идущих подряд одинаковых значений (как правило, нулевых). Ниже показано графическое представление Wavelet-преобразования:
Области чёрного цвета – это наборы нулевых значений, которые будут легко сжиматься при любом архивировании.
Итак, написанная программа раскладывает заданную картинку на составляющие RGB, затем из них получает разложение в YCrCb. Каждую из трёх составляющих YCrCb программа преобразует в Wavelet по алгоритму Хаара. При этом можно задавать количество преобразований и погрешность для каждой составляющей.
При разложении картинки без потерь качества (погрешность равна 0) восстановленное изображение идентично исходному:
При этом чёрных областей в Wavelet_преобразовании мало, а значит, сжатие будет неэффективным. Для лучшего сжатия приходится увеличивать погрешность, что приводит к потерям качества:
В этом случае (погрешность для яркостей равна 5, для цветовых ключей 10) восстановленная картинка имеет незначительные ухудшения качества, заметные, в первую очередь, в разделении неба на квадраты. Во многих случаюях, например, для публикации такой картинки на сайте, такие потери качества можно считать несущественными. При больших погрешностях ухудшение качества становится более заметным. Если ввести большую погрешность для Y и меньшие для Cr и Cb, то на восстановленной картине будут заметны квадраты. При этом цвета останутся яркими:
Если же ввести большие погрешности для составляющих Cr и Cb, то цвета станут блёклыми:
При больших погрешностях и для яркостей, и для цветовых ключей восстановленная картинка примет весьма неприятный вид, но зато будет хорошо сжиматься:
Преимуществом разложения YCrCb является куда более эффективное сжатие фотографий, содержащих в основном серые цвета, так как ключи Cb и Cr для серых цветов представляют собой почти равномерные последовательности:
При незаметных глазу ухудшениях в качестве восстановленной картинки мы имеем много больших чёрных областей в Wavelet-преобразованиях Cr и Cb.