В "GIMP: изменение размера изображения с соблюдением правил RIS" был рассмотрен рецепт масштабирования изображений с устранением "дефекта" (размытия смешением цветов). Но в основном дело приходится иметь с изображениями, полученными из сети. То есть изображения получаем "как есть". Они могут быть многократно масштабированы каким то образом и без соблюдения каких то правил.

Можно ли использовать ту же концепцию, что заложена в RIS, для постфильтрации изображения?

Попробуем. Попытаемся угадать метод интерполяции и масштабный фактор, применённый к изображению. "Угадав" эти характеристики, можно провести обратное масштабирование, после отмасштабировать к размеру исходного слоя и использовать наложения "GIMP: реверс фильтров" для обращения "дефекта".

А как "угадать" то характеристики?

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

Для угадывания масштабного фактора могла бы помочь утилита resdet. Но её сборок под Windows я не видел, а альтернатив не знаю. Возможно существуют онлайн сервисы для определения/оценки исходных размеров масштабированных изображений.

Реализация?

Чтобы не производить муторные однотипные операции к скрипту "resize-ris.scm" был добавлен скрипт "ris-undefect.scm" в последнем релизе "gimp-plugin-resize-ris 0.20250518". После копирования данного файла в папку со скриптами GIMP, в меню "Изображения" -> "Преобразования" рядом с пунктом "Resize RIS" появится пункт "RIS undefect".

Для тестирования будем традиционно использовать изображение "Лена".

Изображение "Лена".
Изображение "Лена".

В GIMP используя инструмент "Изображение" -> "Размер изображения..." увеличим данное изображение в 8 раз (800%), используя "Кубическую" интерполяцию.

Центральный участок увеличенного изображения.
Центральный участок увеличенного изображения.

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

Каким то образом (скорее всего интуицией) удалось "угадать" (допустим), что данное изображение является результатом 8-ми кратного увеличения. Тогда обратный фактор будет:

factor = 1.0 / 8 = 0.125

Применим новый скрипт с данными параметрами к изображению.

Диалог скрипта "RIS undefect".
Диалог скрипта "RIS undefect".

Этот скрипт в отдельном слое проведёт масштабирование на указанную величину, возврат к размеру исходного слоя и обращение "дефекта".

Результат "RIS undefect"
Результат "RIS undefect"

Как минимум частично концепция сработала. Изображение стало не просто менее размытым, а размытие перестало бить по глазам. Вполне рабочий вариант. Остался только вопрос, как «угадывать» характеристики изображения. Пока ответ один: именно «угадывать» методом перебора множества различных значений масштабного фактора.

Сравнение?

Как и скрипт «Resize RIS», данный скрипт формирует новый слой. Сравнение производится визуально отключением/включением видимости верхнего слоя.

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


  1. GCU
    18.05.2025 15:15

    Что такое "правило RIS"?


    1. zvezdochiot Автор
      18.05.2025 15:15

      Ссылка на целую статью дана. Процитирую:

      "Правила RIS (Reverse Interpolate Scale) рассматривают методы и методики минимизации, либо полного устранения (если это возможно) данного «дефекта» для некоторых видов масштабирования."

      А ежели совсем просто: При масштабировании прямо-обратно в идеале получить исходное изображение.


      1. orekh
        18.05.2025 15:15

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

        Когда-то и сам написал скрипт для такого. Он слишком примитивен для того чтобы хорошо выглядеть при коэффициенте масштабирования 2 и больше (тут уже нужны нейросети или хотя-бы Edge Directed Interpolation), но когда нужно изменить размер на несколько пикселей, то выглядит заметно чётче простой интерполяции https://crates.io/crates/sharpened_bilinear


        1. zvezdochiot Автор
          18.05.2025 15:15

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

          "Линейная" интерполяция, фактор 0.125
          "Линейная" интерполяция, фактор 0.125

          И нет. Это не суперразрешение. Это развитие интерполяционных методов для устранения их главного недостатка.


          1. orekh
            18.05.2025 15:15

            То что там внутри используется интерполяция не означает, что весь процесс является интерполяцией.

            Интерполяция - это проведение некого непрерывного полинома между известными точками. В случае линейной интерполяции этим полиномом является простая линейная функция, так что при увеличении в 3 раза из пикселей А, Б и В получится последовательность из оригинальных пикселей перемежаемых парой промежуточных: А, (⅔А + ⅓Б), (⅓А + ⅔Б), Б, (⅔Б + ⅓В), (⅓Б + ⅔В), В.

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

            Вы же после интерполяции уменьшаете изображение, вычисляете ошибку и корректируете входные значения для интерполяции так, чтобы при очередном уменьшении получить изображение близкое к исходному. Так как пиксели в оригинальных точках меняют значения, то это не интерполяция. Подбирая такие значения точек полинома, чтобы среднее конечных пикселей было равно Б = ((⅓А' + ⅔Б') + Б' + (⅔Б' + ⅓В')) / 3, где значения со штрихом - подбираемые корректируемые, вы решаете задачу суперразрешения.


            1. zvezdochiot Автор
              18.05.2025 15:15

              Утверждение "интерполяция по определению обратима" для изображений в общем случае неверно. Оно верно только когда узлы большого и маленького изображения точно совпадают. Обычно это всегда не так. В приведённом примере для изображения 512x512 и увеличенного до 4096x4096 практически ни один узел не совпадёт.

              \{i,j\}_{target} = scale * (\{i,j\}_{source} + 0.5) - 0.5

              То есть происходит то самое смешение цветов. И свёртка в данном случае слабо влияет на что-либо.

              Для уменьшения размера GIMP использует интерполяцию, причём ровно ту, что выбиракется пользователем.

              Ваше объяснение разницы двух слоёв не только не объясняет результат, а наоборот делает его "странным" и "необъяснённым". В операции участвует только масштабирование. А где тогда указанный вами подбор чего то там?


      1. GCU
        18.05.2025 15:15

        Но ведь это и так работает хорошо, например с тем же фильтром Ланцоша. Проблема в том ,что само изображение хранится не в линейном цветовом пространстве, а в гамма кодированном (sRGB), и при преобразовании делается выбор в пользу более точного совпадения отдельных пикселей, а не суммы группы. Если я правильно понимаю - скрипт как раз компенсирует накопившуюся ошибку группы, но по сути это же добавление шума чтобы сумма по группе сошлась?


        1. zvezdochiot Автор
          18.05.2025 15:15

          Добавление шума? То есть фильтр?

          Но в используемом методе никакой непосредственный фильтр не применяется, только масштабирование прямо-обратно и разность, путём наложений.