Fractal image compression

Fractal image compression — увлекательное применение фрактальной теории, в частности, для сжатия изображений.

Описание

С помощью этого приложения вы можете:

  • Сжатие изображений с помощью этого фрактального метода
  • Декомпрессировать ранее сжатые изображения в другой формат

Использование библиотек платформы, которые включают в себя следующие элементы:

  • Многоязычный
  • Сопоставимый рост с многоразрешенным разрешением
  • Опция темного режима
  • Уведомление о новой версии


Профи:

  • При правильной запрограммированности он функционирует независимо от разрешения изображения
  • Это определённый метод сжатия.
  • Позволяет тебе учиться по ходу.


Конс:

  • Процесс сжатия очень медленный.
  • Вы не достигаете очень высоких коэффициентов сжатия (по крайней мере, с параметрами, которые я использовал)

Описание кода

Это реализация этогоfractal image compression алгоритмопубликовано в IEEE в мои дни обучения в колледже

В этой программе используется библиотека < < Делаунай > > для постепенной триангуляции, которая также используется в системе < < Делаунай > >.Заявка на морфизацию


Алгоритм высокого уровня:

  • Компрессия:
    • Фрактальное сжатие фокусируется на сохранении связей между регионами изображения, а не на фактических пикселях, особенно между треугольниками в данном случае.
    • Изображение разделено на треугольную сетку, состоящую из нескольких треугольников и образующую триангулированную область.
    • Изображение подразделяется на новый набор триангуляций с более крупными треугольниками, предназначенными для кодовой книги.
    • Триангуляции являются динамическими, и алгоритм разделения и слияния применяется на основе вариации пикселей треугольника.
    • После определения триангуляции для кодового справочника наиболее репрезентативные 2°n треугольники выбираются для формирования кодового справочника. Значение n существенно влияет на время сжатия, оказывая при этом незначительное воздействие на коэффициент сжатия и достигнутое качество.
    • Для каждого треугольника домена оптимальное картирование с треугольником из кодера запрашивается с использованием критерия минимальной средней квадратной погрешности (MSE)
    • Оптимальное картирование между треугольниками можно найти путем создания комбинаций:
      • Перемены вершин (6 вариантов)
      • Определение размера компенсации в связи со средним уровнем
      • Для предотвращения расхождений в ходе итеративного процесса декомпрессии этот коэффициент шкалы должен оставаться в пределах 0-1.
      Кроме того, эти параметры следует категоризировать с использованием ограниченного числа битов для обеспечения того, чтобы как время сжатия, так и соотношение были разумными и соответствовали требуемому качеству.
  • Записанная в сжатом файле информация по каждому каналу:
    • Информация для воспроизведения двух триангуляций:
      • Треугольники, разделенные в каждой итерации
      • Вертики, которые были удалены в результате слияния (после завершения раздельных итераций)
    • Выбор 2 хеновых треугольников в кодовом справочнике
    • Оптимальное картирование каждого домена треугольника:
      • Какой треугольник, который он использует для картирования (n бит)
      • Оптимальная перестановка позвоночника (6 комбинаций, 3 бита)
      • Компенсация (авторы указывают, что компенсация фактически представлена в 6 бит)
      • Масштаб (авторы указывают, что шкала фактически представлена 6 битами)
  • Декомпрессия (для каждого канала):
    • Треугольники двух триангуляций получаются.
    • Получены треугольники с кодировкой.
    • Этот процесс повторяется до тех пор, пока не будет достигнуто сближение:
      • Картирование всех доменных треугольников в их оптимальную корреляцию с треугольниками кодовой книги


После получения степени магистра искусственного интеллекта, я представляю, как извлечь наиболее значимые треугольники для кодового справочника, применяя K-медоиды.

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


Обработка изображений подразделяется на каналы, как правило, RGB.

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


С версией V1.1 был добавлен читатель, совместимый со стандартом IMOIO.

Таким образом, вы можете открыть сжатое изображение (.dfc) с приложением просто следующим образом:

BufferedImage image = ImageIO.read("image.dfc");

Окна

Fractal image compression v1,0 (2022-2024)

Смотреть видео
Загрузка

Fractal image compression v1.1 (2026)

Загрузка

Версия

image

В приложении используется алгоритм fractal image compression, описанный в газете IEEE из моих университетских дней.

Я сотрудничал с одноклассником университета в разработке первоначальной версии этого алгоритма во время стажировки на последнем курсе Телеко Телевидения (план 64 Барселоны).

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

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

Сейчас, 25 лет спустя, я представляю вам новую реализацию алгоритма, полностью разработанного и завершенного за рекордное время в две недели.

Очевидно, что что-то будет улучшено 25 лет спустя. Кроме того, на этот раз с дополнительной функциональной поддержкой для обработки треугольников, которые я уже запрограммировал для приложения с эффектом Морфинга.

На этот раз, используя триангуляционную библиотеку Делаунай, запрограммированную профессионалами.

Очевидно, что когда тебе не нужно делать кирпичи самому, чем быстрее ты сможешь построить стены...


Демонстрационные видеоматериалы

image

Новая функция в версии v1.1 - это добавление фрактал-компрессированного считывателя изображений в приложение, совместимое с IMO.

Таким образом, вы можете прочитать сжатое изображение (.dfc) со следующим приложением:


BufferedImage image = ImageIO.read("image.dfc");


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

Но результат совсем не плох.

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


04/05/2026 - 04/12/2026 После восстановления эволюции этого приложения, я предлагаю провести тесты с реальными изображениями, и я попробую его с одним из пикселей "4000 x 3000".

Я сталкиваюсь со многими проблемами:

  • Процесс занимает вечность в разделительных итерациях (из-за обширных триангуляции до 400 000 треугольников и что проверка на разделение была повторена для всех треугольников в каждой итерации)
  • Память заканчивается после того, как я достиг предела в 23 ГБ, который был у меня в организме.
    • Результат разделения и слияния итераций хранился в булевом списке (около 16 итераций х 2 типа триангуляции х 3 канала х 400 000 элементов!!!!!!!!), что в общей сложности составляет около 40 000 000 элементов, что все еще приемлемо)
    • Кроме того, выбор книги наиболее репрезентативных треугольников (начиная с 256) был произведен с помощью K-медоидов (более 400 000 элементов) (я думаю, что память, использованная этим алгоритмом, о(n)2. Теперь она выходит из-под контроля...)
    • И, что касается еще INRI, эти расчеты проводились параллельно по трем каналам (Rgb)!!
  • Как только эти проблемы будут решены, я смогу сжать изображение (4000 x 3000), но я вижу, что для завершения работы требуется от 6 до 8 часов.

И я предлагаю решить их:

  • За вечность раскола. Решение:
    • Я увеличиваю минимальный размер треугольников для деления, шаг за шагом пропорциональный количеству пикселей в картинке, что приводит к сокращению числа треугольников в триангуляциях. В используемом образе (4000 x 3000) число треугольников делится более чем на 4 (мы перешли от примерно 400 000 треугольников к примерно 100 000 треугольников).
    • Кроме того, я создаю набор с треугольниками, которые не отвечают критерию разделения (относительно разницы значений их пикселей), чтобы не повторять их в каждой итерации.
  • У системы кончается память. Решение:
    • Результат разделения и слияния в булевых списках. Решение:
      • По мере развития итераций, числа треугольников, которые делятся, значительно меньше, используемая память сохраняется путем хранения индексов треугольников, которые делятся в наборе.
    • Память о K-медоидах (предположительно O(n)2). Решение:
      • Поскольку мы разделили число треугольников на 4, память, необходимая для этого алгоритма, это сокращение треугольников предполагает разделение памяти, используемой коэффициентом около 16.
      • Параллельно три к-медоида (по одному на каждый канал). Решение:
        • Мы последовательно вычисляем триангуляции и выбираем наиболее репрезентативные треугольники для книги кодов (с K-медоидами).
      • Мы разделили память, необходимую для К-медоидов 48!
  • Время обработки "реальных" изображений занимает вечность (сжатие примера занимает от 6 до 8 часов) с тремя нитями, по одной для каждого канала. Решение:
    • Сделайте количество ниточек перегруппируемым. (Назначив их 23 нитями (в моей системе 24 ядра), время обработки сокращается до трех с половиной часов).
  • Последствия решения:
    • Последствие деления числа треугольников на 4, очевидно, приводит к заметной потере качества сжатого изображения, но с такой разрешающей способностью, это не так важно.
    • Разделяя число треугольников на 4, это также приводит к разделению размера сжатого файла, предположительно также порядка 4.

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

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

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

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

Хотя, возможно, было бы более целесообразно найти общий бесполезный компрессор, как Zip или 7z, и применить его к глобализму сжатого файла... возможно, в следующий раз.


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

Используя это небольшое новое приложение на паре файлов с оригинальным кодированием (одно из 143x143 и другое из 4000x3000), размер сжатого файла сокращается примерно на 4% в них.

Видеоматериалы

Загрузка