В VK есть группа со следующим описанием:


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

Слева исходная картинка, загруженная 7 июня 2012, справа — какая она сейчас.


КДПВ


Видео

Такая разница очень подозрительна. Попробуем разобраться, что происходило в течение этих 7 лет. Для ознакомления есть статья на Медузе про эту группу, но нас будет интересовать только техническая сторона.


Почему и на каком этапе JPEG сжимает с потерями


Рассмотрим сильно упрощенную схему кодирования и декодирования JPEG. Показаны только те операции, которые иллюстрируют основные принципы алгоритма JPEG.


Основные принципы алгоритма JPEG


Итак, 4 операции:


  • DCT — дискретное косинусное преобразование.
  • Квантование — округление каждого значения до ближайшей величины, кратной шагу квантования: y = [x/h]*h, где h — шаг.
  • IDCT — обратное дискретное косинусное преобразование.
  • Округление — обычное округление. Этот этап можно было не показывать на схеме, так как он очевиден. Но далее будет продемонстрирована его важность.

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


Рассмотрим эти шаги подробнее.


DCT


Так как существует несколько вариаций DCT, то на всякий случай уточню, что JPEG использует DCT второго типа с нормализацией. При кодировании каждое изображение разбивается на квадраты 8x8 (для каждого канала). Каждый такой квадрат можно представить в виде 64-мерного вектора. Косинусное преобразование заключается в нахождении координат этого вектора в другом ортонормированном базисе. Сложно визуализировать 64-мерное пространство, поэтому далее будут приведены 2-мерные аналогии. Можете представлять, что картинка разбивается на блоки 2x1. На графиках, которые будут продемонстрированы далее, оси x соответствуют значения первого пикселя блока, оси y — второго.


Продолжая аналогию на конкретном примере, допустим, что значения двух пикселей из исходного изображения — 3 и 4. Нарисуем вектор (3, 4) в исходном базисе, как показано на рисунке ниже. Исходный базис отмечен синим цветом. Координаты вектора в некотором новом базисе — (4.8, 1.4).


Пример преобразования вектора в новом базисе


В рассмотренном примере новый базис был выбран случайно. DCT же предлагает вполне конкретный 64-мерный фиксированный базис. Обоснование того, почему в JPEG используется именно он, очень интересно, и описывалось мной в другой статье. Затронем лишь суть. В целом значения всех пикселей равноценны. Но если преобразовать их с помощью DCT, то из получившихся 64 координат в новом базисе (называемых коэффициентами DCT-преобразования) мы можем смело обнулить или грубо округлить их некоторую часть, получив минимальные потери. Это возможно благодаря особенностям сжимаемых изображений.


Квантование


В файле нельзя сохранить дробные значения. Поэтому, в зависимости от шага квантования, значения 4.8, 1.4 будут сохранены так:


  • при шаге 1 (самый щадящий вариант): 5 и 1,
  • при шаге 2: 4 и 2,
  • при шаге 3: 6 и 0.

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


IDCT


То же самое, что DCT, но с транспонированным базисом. Математически, x = IDCT(DCT(x)), поэтому если бы не было квантования, то можно было бы восстанавливать без потерь. Но не было бы и сжатия. Из-за использования квантования исходный вектор не всегда можно вычислить точно. На следующем рисунке представлены 2 примера с точным и неточным восстановлением. Наклонной сетке соответствует новый базис, прямой — исходный.


2 примера с точным и неточным восстановлением векторов


Возникает очевидный вопрос: может ли последовательность перекодирований привести к вектору, сильно отличающегося от исходного? Может.


Последовательность перекодирований векторов


Интересно было бы перебрать все целочисленные векторы и посмотреть, к чему приведет их перекодирование. Для уменьшения информационного шума, уберем сетку исходного базиса и будем напрямую соединять отрезками исходные и восстановленные векторы (без промежуточного шага). Сначала рассмотрим шаг квантования равный 1 для всех координат. Новый базис на следующем рисунке повернут на 45 градусов и для него имеем 17.1% неточных восстановлений. Цвета отрезков ничего не означают, но они будут полезны для предотвращения их визуального слияния.


Перебор векторов для нового базиса в 45 градусов


Этот базис — на 10.3 градусов с 7.4% неточных восстановлений:


Перебор векторов для нового базиса в 10.3 градусов


Вблизи:


Перебор векторов для нового базиса в 10.3 градусов вблизи


А этот — на 10.4 с 6.4%:


Перебор векторов для нового базиса в 10.4 градусов


19 градусов с 12.5%:


Перебор векторов для нового базиса в 19 градусов


А вот если задать шаг квантования больше 1, то восстановленные векторы начинают явно концентрироваться близко к узлам сетки. Это шаг 5:


Шаг 5


Это 2:


Шаг 2


Если изображение перекодировать несколько раз, но с одинаковым шагом, то почти ничего не произойдет по сравнению с однократным перекодированием. Значения как бы «застревают» в узлах сетки и уже не могут «выпрыгнуть» оттуда в другие узлы. Если же шаг разный, то вектор будет «скакать» из одного узла сетки в другой. Это может завести его как угодно далеко. На следующем рисунке показан результат 4 перекодирований с шагами 1, 2, 3, 4. Можно разглядеть крупную сетку с шагом 12. Это значение — наименьшее общее кратное 1, 2, 3, 4.


Результат 4 перекодирований с шагами 1, 2, 3, 4


А на этом — с шагами от 1 до 7. Визуализация показана только для части исходных векторов, чтобы улучшить наглядность.


результат 4 перекодирований с шагами от 1 до 4


Округление


А зачем округлять значения после IDCT? Ведь если избавиться от этого этапа, то восстанавливаемое изображение будет представлено дробными значениями, и мы ничего не потеряем при повторном кодировании. С математической точки зрения, мы будем просто переходить от одного базиса к другому без потерь. Здесь необходимо упомянуть о преобразовании цветовых пространств. Хотя JPEG не регламентирует цветовое пространство и позволяет сохранять непосредственно в исходном RGB, но в подавляющем количестве случаев используется предварительная конвертация в YCbCr. Особенности глаза и все такое. А такая конвертация тоже приводит к потерям.


Предположим, мы получили JPEG-файл, сжатый с максимальным качеством, то есть с шагом квантования 1 для всех коэффициентов. Мы не знаем, какой кодек был использован, но обычно кодеки выполняют округление после преобразования RGB -> YCbCr. Так как качество максимально, то после IDCT мы получим дробные, но довольно близкие значения к исходным в пространстве YCbCr. Если округлим, то большинство из них восстановятся в точности.


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


Изменения без округления


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


Примеры многократного перекодирования


Исходный кот:


Исходный кот


После одного пересохранения с качеством 50:


Исходный кот после одного пересохранения с качеством 50


После любого последующего количества перекодирований с тем же качеством картинка не меняется. Теперь будем плавно снижать качество с 90 до 50 через 1:


Плавное снижение качества с 90 до 50 через 1


Произошло примерно то же, что и на уже приводимом графике:


результат 4 перекодирований с шагами от 1 до 4


После одного пересохранения с качеством 20:


После одного пересохранения с качеством 20


Плавно с 90 до 20:


Плавное снижение качества с 90 до 20


Теперь 1000 раз со случайным качеством от 80 до 90:


1000 пересохранений со случайным качеством от 80 до 90


10000 раз:


10000 пересохранений со случайным качеством от 80 до 90


Анализ картинок группы VK


Приступим к анализу более 2000 картинок из группы VK. Сначала проверим среднее абсолютное отклонение от самой первой. По оси x — номер картинки (или день), по y — отклонение.


Среднее абсолютное отклонение от первой


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


Среднее абсолютное отклонение соседних картинок


Небольшие колебания в начале — нормальное явление. До 232-й все идет хорошо, картинки полностью идентичны. А 233-я внезапно отличается в среднем на 1.23 для каждого пикселя (по шкале от 0 до 255). Это много. Возможно просто изменились таблицы квантования. Проверим. А заодно сравним с размером получаемых файлов.


Изменения качества


Да таблицы менялись. Но не раньше чем у 700-х. Тогда, возможно, происходило промежуточное скрытое перекодирование с низким качеством. Попробуем дважды перекодировать 232-ю. Для первого раза будем перебирать различные уровни качества, а для второго используем ту же таблицу квантования, что и для всех от 1-й до 700-х. Наша цель — получить картинку максимально похожую на 233-ю. На следующем рисунке по оси x — качество промежуточного перекодирования, по y — среднее абсолютное отклонение от 233-й.


Добавление скрытого перекодирования


Хотя на графике и есть провал при качестве 75%, примерно равный 1, но все еще далеко от желаемого нуля. Добавление 2-го промежуточного этапа и изменение параметров субдискретизации (subsampling) не улучшило ситуацию.


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


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


Архив с картинками, для самостоятельного исследования.

Комментарии (91)


  1. token
    29.10.2019 13:37
    +2

    А почему в подвале топика нет блока со словами "Минутка заботы об нло?"


    1. Fil Автор
      29.10.2019 13:46
      +2

      Надеюсь, не понадобится :) Поставить плашку может только редакция, кажется


    1. vlreshet
      29.10.2019 13:57
      +3

      Сейчас пойдёт по всем жёлтым СМИ «ШОК! Айтишники попытались сжать путина!»


      1. tvr
        29.10.2019 14:01
        +1

        «ШОК! Айтишники попытались сжать путина!»

        «ШОК! Сенсация! В процессе сжатия он стёрся!»


        1. Nikoobraz
          29.10.2019 14:57

          ШОК! Айтишники попытались провести над Путиным обряд обращения в шакала!


          1. elenagra
            30.10.2019 07:29

            В котика же!


            1. RiseOfDeath
              30.10.2019 10:01
              +2

              Видимо имеется ввиду измерение степени сжатия JPEG в @бучих шакалах.


      1. edwardspec
        29.10.2019 15:01

        И внесут «Законопроект о запрете применения формата JPEG к фотографиям представителей власти»


        1. NetBUG
          29.10.2019 18:24

          Бедные дурналисты…


          1. timoteo_cirkla
            29.10.2019 18:28
            -1

            Вы эту приставку не к тем применили. Не журналисты у нас принимают дурные законы, предварительно нюхнув кокса.


            1. tbl
              30.10.2019 00:47
              +2

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


      1. token
        29.10.2019 16:34

        Мне кажется сабж — типа гидрашки. Плотность сильно большая, не сжимается.


        1. Nalivai
          30.10.2019 12:50

          рашки

          И немедленно двушечка


    1. tvr
      29.10.2019 13:57

      «Минутка заботы об нло?»

      Наверное потому, что НЛО в заботе не нуждается — оно само есть воплощенная забота.


  1. alkoro
    29.10.2019 13:48

    Знакомый Тимур спрашивает: Есть видео с 2257-ю кадрами преобразования сабжа?


    1. Fil Автор
      29.10.2019 13:51

      Вечером выложу архив с фотками


    1. ice2heart
      29.10.2019 13:56
      +2

      https://ice2heart.com/doomguy.mp4
      Тут что-то около тысячи преобразований.


      1. GCU
        29.10.2019 15:00

        Progressive JPEG «наоборот».
        Прикольно что даже на макроблоках потеряли цвет.


        1. ice2heart
          29.10.2019 15:32

          Я немножко с читерил я изменял размер изображения. gist.github.com/ice2heart/7206ce3771ac3dcf95f6c4d071c0e4a0 так оно «зашакливается» лучше.


          1. Dim0v
            29.10.2019 17:46

            Если была цель скомпенсировать изменения размера, то вместо умножения на 0.8 стоило делить на 1.2. Сейчас там изображение становится в среднем на 2% меньше с каждым преобразованием (1.2 * 0.8 = 0.96).


            Ну и по видео очень заметно, что разрешение очень быстро упало за первые секунд 5 и причина явно не в jpeg.


            1. ice2heart
              29.10.2019 17:54

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


            1. ice2heart
              29.10.2019 18:15

              ice2heart.com/Lenna.mp4 так лучше выглядит?


              1. Dim0v
                29.10.2019 18:17

                Да, теперь шакалы вполне себе jpeg-овые)


      1. safari2012
        29.10.2019 15:58

        тут ВВП какой-то неканоничный :)


        1. andersong
          31.10.2019 09:05

          Это оригинал.


    1. Fil Автор
      29.10.2019 18:46

      Готово! Смотрите под КДПВ


  1. Enverest
    29.10.2019 15:13
    +2

    Хотелось бы ещё увидеть график изменения размера изображения (в КБ) от этих перезаливаний.


    1. Fil Автор
      29.10.2019 19:15

      Добавил размер файла в график с качеством


    1. mammuthus
      31.10.2019 18:16

      Только в КГБ.


  1. slg
    29.10.2019 15:15
    +2

    А если Чака Норриса перезаливать?


    1. vlreshet
      29.10.2019 15:18
      +8

      То качество будет улучшаться, а в конце получится 3D модель с огромным dpi


      1. sumanai
        29.10.2019 19:40

        Боюсь, на 9000 шаге пользователю не удастся скачать файл, не хватит места.


        1. solovetski
          31.10.2019 20:59

          >Боюсь, на 9000 шаге пользователю не удастся скачать файл, потому что файл с Чаком сам скачает пользователя.
          fixed!


  1. denisshabr
    29.10.2019 15:28

    Интересно, что будет, если после распаковки Jpeg использовать различные алгоритмы улучшения Jpeg, deblock и прочее?
    Наприемр Topaz JPEG to RAW AI. Ведь была даже идея встроить такие штуки в стандарт декодера, и что-то похожее на это реализовали в h264, in-loop deblocking, и ещё что-то более сильное в h265.


    1. Arqwer
      29.10.2019 16:03

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


      1. Sartorio
        29.10.2019 20:42
        +15

        Медведева что-ли?


        1. roscomtheend
          30.10.2019 12:42

          Такое уже было несколько лет назад, теперь мы знаем как оно вышло.


        1. perfect_genius
          30.10.2019 13:12
          +1

          Скорее:

          image


    1. teemour
      29.10.2019 20:55
      +3

      имеет смысл, как и ботокс


  1. moth-in-relay
    29.10.2019 15:33

    Что станет с видео, если его перезаписать 20 раз на видеокассетах:
    www.youtube.com/watch?v=G8GOcB6H0uQ


    1. nick_gabpe
      29.10.2019 16:13

      Очень странный рикролл :)


    1. bodqhrohro
      30.10.2019 16:37

      Плохой пример, тут то ли видак плохо трекинг держит, либо исходная кассета уже изношенная — из-за раздваивания контуров видео быстро в кашу превратилось. Вот перезаписи покачественнее, тут долго издевались:


      PAL (если не открывается из-за копирастов — дубль)


      MESECAM


      1. WST
        01.11.2019 13:31

        Ух… Слишком символично, даже слёзы наворачиваются.


  1. dka700
    29.10.2019 15:39
    +1

    Вот забугорный блогер перезаливает видео на YouTube 1000 раз.
    https://youtu.be/JR4KHfqw-oE


    1. VADemon
      01.11.2019 13:58

      Всё новое — хорошо забытое старое? www.youtube.com/watch?v=icruGcSsPp0


  1. Keynessian
    29.10.2019 15:44

    А mp3 после многократного перекодирования как звучит?


    1. Flagman
      29.10.2019 17:52
      +1

      Как песни Егора Крида.


    1. NetBUG
      29.10.2019 18:25

      My is Linus Torvalds, and I pronounce PulseAudio as Pshshshhsshshhhhh


      1. timoteo_cirkla
        29.10.2019 18:30
        +2

        Слишком толсто. Попробуйте вытереть жЫр.


  1. S-trace
    29.10.2019 15:46

    Иллюстрация к пункту «Почему и на каком этапе JPEG сжимает с потерями» не совсем правильная. «Восстановленное» изображение должно быть покрыто JPEG-артефактами.


  1. BkmzSpb
    29.10.2019 16:02

    Минутка наркомании, не судите строго: я не смог быстрым поиском найти информацию о JPEG-инвариантных изображениях (изображения, которые не меняются в результате однократного сжатия/восстановления). Если предположить, что таковые существуют, то для них верно (примерно) следующее:
    I = JPEG-1 (JPEG (I))
    Можно пойти дальше: Пусть I0 — исходное изображение. Строим последовательность In= JPEG-1(JPEG(In-1)). Существует ли такое неотрицательное конечное N, что для любого n > N: In+1= In= J, где J — инвариантный JPEG-образ исходного изображения? Единственнен ли такой образ если он существует? Является ли он нетривиальным (отличается ли от равномерно-залитого прямоугольника, например). Можно ли найти простое преобразование из I0 в J и использовать J как исходное изображение, которое не будет меняться при сжатии/восстановлении JPEG (хотя бы при каком-то фиксированном наборе параметров), но при этом для человека будет слабо отличаться от исходного?


    1. sim31r
      30.10.2019 00:53

      (отличается ли от равномерно-залитого прямоугольника, например)

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


    1. Norno
      31.10.2019 16:49

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

      Заголовок спойлера
      image


  1. VasikAlexey
    29.10.2019 16:25

    Так и как заставить камеру смартфона и клиент ВК пользоваться форматами и алгоритмами сжатия без потерь? На первое ответ raw, на второе не нашёл пока)


    1. FTOH
      29.10.2019 17:11
      +1

      Вк все фотографии конвертирует в jpeg. Только через документы можно отправить без сжатия.


  1. sim2q
    29.10.2019 16:47

    Спасибо!
    Теперь кажется понятно, почему фотошоп настойчиво предлагает сохранить «в том же качестве» по умолчанию. Надеюсь, что именно для уменьшения ошибок.
    ps отдельное спасибо и за статью по ссылке, пришлось предварительно тоже прочитать. Интересуюсь давно, но так и не осилил разобраться. Хотелось на основе готовых таблиц из jpeg файла извлекать какой-нибудь pHash без декодирования всей картинки.


  1. PeterK
    29.10.2019 17:03

    И тут — оно вылезло.


  1. jugard
    29.10.2019 17:31

    Портрет Дориана Грея


  1. EviGL
    29.10.2019 17:38
    +1

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


    1. gnomeby
      29.10.2019 18:28
      +2

      А денег на карту вам ещё не надо было автору закинуть?


    1. Fil Автор
      29.10.2019 18:50

      Добавил видео под КДПВ. Кот, потому что не хотел еще больше триггеров. Да и это не так уж важно. Если пересохранять с тем же качеством, что и у картинок Путина, то визуально не будет заметно разницы от исходной. А в группе VK есть почему-то.


      1. EviGL
        29.10.2019 18:56

        Спасибо, с видео и графики понятнее, график отклонения явно читается на видео.
        А на вопрос причин, я ставлю на то, что администратор группы просто решил разнообразить контент. Даже видны конкретные моменты, когда он внёс одно искажение в алгоритм и когда внёс второе.


        P.S. Осталось сопоставить даты внесения искажений и проверить, не проходило ли в те дни каких-либо [минутка заботы НЛО].


    1. Gamliel_Fishkin
      29.10.2019 23:13
      +1

      Я разочарован, что внутри статьи какие-то фотки кота, вместо Путина.
      Если не Путин, то кот?
      (Твиттер)


  1. kacetal
    29.10.2019 18:41

    Получается по качеству можно определить примерное количество раз которое картинка была закачана и скачана?


    1. gnomeby
      29.10.2019 18:43
      +1

      Не скачана/закачена, а пересохранена.


  1. gnomeby
    29.10.2019 18:45
    +1

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

    Может быть это был просто PrintScreen области экрана с последующим сохранением?


    1. Don_Koton
      30.10.2019 06:40

      Кстати такой эффект часто бывает когда картинке в каком-нибудь простейшем графическом редакторе выкручивают показатель «чёткость» на максимум


      1. ClearAirTurbulence
        30.10.2019 15:02

        Ну это потому что имеющиеся артефакты этой самой четкостью делаются очевиднее.


  1. NP447
    29.10.2019 19:31
    +1

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

    Именно происходит изменение изображения на vk-сервере. При приёме изображения от пользователя его немного ужимают с потерей качества, а также преобразуют PNG и GIF в JPEG и уменьшают размер изображения до 2048 по большей стороне, если таковой был превышен. Именно по причине обработки изображения на сервере в vk не работает такая вещь, как rarjpeg.

    Но это всё если загружать картинку в раздел фотографий. Если же загружать картинку как документ, то её обработки не происходит, можно загружать картинки размером больше чем 2048х2048, rarjpeg работает.


  1. S-trace
    29.10.2019 20:00

    Немного напомнило, кстати, видео «What I saw before the darkness».

    Хотя, конечно, не настолько жесть…


  1. we1
    29.10.2019 20:02

    Давно мучает вопрос: есть ли в JPEG-файле запись с каким качеством было сделано сжатие или это вычисляется на основе каких-то данных при декодировании? И если это просто записанное число, то какой стандарт описывает какое число нужно сохранять, чтобы все остальные поняли как было сделано сжатие?


    1. Fil Автор
      29.10.2019 20:08

      Да, есть, это таблицы квантования. Если упрощенно, то если исходный коэффициент был 13, а шаг квантования 5, то в файле сохранится шаг и число 3 (потому что [13/5] = 3). Декодер умножит 3 на 5 и получит 15 (а не 13).


  1. aleksandros
    29.10.2019 21:54

    Во всём этом самое непонятное — зачем ВК пережимает и без того маленькую по разрешению и по размеру фотку?


    1. andreishe
      29.10.2019 23:54

      Я думаю, они пережимают просто все фотки без разбора. Вероятно, не в последнюю очередь, чтобы гарантированно избавиться от всякого лишнего (типа rarjpg), что может быть добавлено в нагрузку к картинке.


  1. Astroscope
    29.10.2019 21:56

    В кота-то за что сжали?


  1. ALexhha
    29.10.2019 23:46

    А это применимо только для jpg и на рng тоже будет проявляться?


    1. Dim0v
      30.10.2019 00:23

      png — это формат с lossless сжатием.


  1. akhkmed
    30.10.2019 00:49
    +1

    Потрясающая эта и предыдущая статья про jpeg.
    Подскажите, существует ли простой способ поместить в jpeg обратное кусочное DC- преобразование произвольного бинарного файла так, чтобы оно пережило несколько пересохранений подряд с возможностью восстановления содержимого файла? И как мог бы выглядеть такой "рисунок"?


    1. sim31r
      30.10.2019 00:56
      +2

      QR код например?


      1. tbl
        30.10.2019 11:57

        Уже пробовали так стеганографировать: Хватало 5-7%-маски по обоим цветоразностным каналам (глаз острее воспринимает изменение яркости, чем цвета), и ресайзить так, чтобы 1 «пиксель» qr-маски покрывал кратные 8x8-блоки изображения (8х8, 8х16, 16х16, ...). Исходная информация восстанавливалась, имея оригинал изображения, даже со скриншота экрана монитора на телефон. Двойное слепое тестирование показало: человек не видит, что в картинке хранится какая-то другая информация.


        1. Alexsey
          31.10.2019 20:39

          А какие изменения в изображении такой метод переживает?


        1. Tomasina
          31.10.2019 21:31

          Прошу статью на хабре, с фоточками и разбором.


    1. DistortNeo
      30.10.2019 13:42

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


  1. xDimaRus
    30.10.2019 00:50
    +3

    Когда я услышал про этот эксперимент с фоткой пу думал вот оно пробитие дна. А нет, сейчас понял что ошибался )))


  1. tbl
    30.10.2019 01:07
    +1

    Хм, интересное представление процесса DCT, спасибо. В институте мы изучали его только со стороны преобразования Фурье как оператора свертки, где в 2-мерном случае можно выкинуть синусы и оставить только косинусы (ну или наоборот синусы, просто с косинусами работать проще). Ни разу не задумывался, что DCT/IDCT можно представить, как оператор трансляции базиса в 64-мерном пространстве.


  1. KoToSveen
    30.10.2019 02:46
    +1

    Комментарии с Пикабу завезли?


  1. Miritvorech
    30.10.2019 07:30
    +1

    Потрясающе! Вашу бы энергию да на благое дело!)))
    А статья действительно интересная, продолжай!)


  1. Color
    30.10.2019 11:23


  1. SantaCluster
    30.10.2019 14:40

    продолжайте пересохранять дальше. примерно через тыщщи полторы пересохранений фотка начнёт улучшаться. как и вся жизнь в этой стране. :)
    А если серьёзно, продолжайте писать о новых экспериментах с изображениями (с точки зрения работы алгоритмов), очень интересно


  1. nekt
    31.10.2019 19:30

    Видео выглядит как какой-то scp объект


  1. akorulin
    31.10.2019 09:55

    Портрет Дориана Грейя