Тарифы Услуги Сим-карты

Существуют ли алгоритмы для увеличения разрешения изображения? Ликбез: методы ресайза изображений

Установка свойств отображения

В приложении Image Processing Toolbox существует возможность настройки установок, которые контролируют некоторые свойства функций отображения изображений imshow и imtool. Например, использование установок приложения позволяет описать коэффициент увеличения, который применяется при выводе изображений с помощью функций imtool и imshow.

В рамках данного вопроса рассмотрим

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

Установки приложения

Приложение Image Processing Toolbox поддерживает несколько установок, которые влияют на способ отображения изображений с помощью функций imshow и imtool. В таблице приведен список установок и их короткое описание. Для получения более детальной информации относительно установок приложения и их значений см. описание функции iptsetpref.

Установки приложения Описание
ImshowBorder Этот параметр может принимать два значения - "loose" и "tight". Если параметр ImshowBorder принимает значение "loose", то изображение будет отображаться функцией imshow с отступом от края окна figure. Таким образом, в окне остается место для дополнительных надписей. Используется по умолчанию. Если параметр ImshowBorder принимает значение "tight", то изображение будет отображаться функцией imshow так, чтобы оно занимало все окно figure.
ImshowAxesVisible Этот параметр может принимать два значения - "on" и "off". Если параметр ImshowAxesVisible принимает значение "on", то при выводе изображения функцией imshow в окне figure будут дополнительно выведены оси координат. Если же параметр ImshowAxesVisible принимает значение "off", то оси координат выводиться не будут. Значение параметра "off" устанавливается по умолчанию.
ImshowInitialMagnification Управляет коэффициентом увеличения, который используется функцией imshow при выводе изображения.
ImtoolInitialMagnification Контролирует коэффициент увеличения в приложении Image Tool, которое используется для масштабирования изображений.

Получение значений установок приложения

Для определения текущих значений используется функция iptgetpref. Рассмотрим пример использования функции iptgetpref для определения значения свойства imtoolInitialMagnification.

Iptgetpref("ImtoolInitialMagnification") ans = 100

Для более детальной информации см. описание функции iptgetpref.

Установка значений свойств приложения

Для установки значений свойств приложения используется функция iptsetpref. Рассмотрим пример использования функции iptsetpref для установки свойств отображения, которые приводят к тому, что при вызове функции imshow будет изменятся размер окна отображения в соответствии с размерами отображаемого изображения и значением свойства "ImshowBorder".

Iptsetpref("ImshowBorder", "tight");

Для более детальной информации см. описание функции iptsetpref.

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

Рассмотрим основные функции пространственных преобразований, которые реализованы в приложении Image Processing Toolbox.

Терминология Описание основных терминов, которые используются при обработке изображений
Интерполяция Пространственный (или временной) прогноз значений неизвестных значений пикселей между истинными значениями пикселей.
Изменение размеров изображения с помощью функции imresize.
Вращение изображений Использование функции imrotate для поворота изображений.
Вырезание изображения Использование функции imcrop для вырезания прямоугольной части изображения.
Описание основных свойств пространственных преобразований в приложении.

Интерполяция

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

Методы интерполяции

Приложение Image Processing Toolbox использует три встроенных алгоритма интерполяции:

  • Интерполяция по ближайшему соседу - используется значение ближайшего пикселя.
  • Билинейная интерполяция - используется интерполяция по билинейной поверхности.
  • Бикубическая интерполяция - используется интерполяция по бикубической поверхности.

Типы изображений

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

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

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

  • Если данные исходного изображения представлены в формате double, то результирующее изображение будет полутоновым и представленным в формате double. Таким образом, результирующее изображение не будет бинарным, поскольку содержит значения из диапазона между 0 и 1.
  • Если исходное изображение представлено в формате uint8, то результирующее изображение будет бинарным и представленным в формате uint8. Значения интерполирующих пикселей будут округлены к 0 и 1, а результирующее изображение будет представлено в формате uint8.

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

Изменение размеров изображения

Для изменения размеров изображения используется функция imresize. При использовании функции imresize необходимо

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

При использовании функции imresize размер результирующего изображения можно указать двумя путями:

  • через описание коэффициента увеличения.
  • через описание размеров результирующего изображения.

Использование коэффициента увеличения

Для увеличения изображения необходимо, чтобы коэффициент увеличения был больше 1. Для уменьшения изображения необходимо, чтобы коэффициент увеличения находился в диапазоне между 0 и 1. Например, с помощью команды, которая написана ниже, реализуется увеличение изображения I в 1.25 раз.

I = imread("circuit.tif"); J = imresize(I,1.25); imshow(I) figure, imshow(J)

Описание размера результирующего изображения

Существует возможность описать размер результирующего изображения в виде вектора, который содержит два числа - количество строк и столбцов результирующего изображения. Рассмотрим пример создания результирующего изображения Y, которое состоит из 100 строк и 150 столбцов.

Y = imresize(X,)

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

Описание метода интерполяции

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

Рассмотрим пример, когда функция imresize использует билинейную интерполяцию.

Y = imresize(X,,"bilinear")

Использование фильтров препарирования изображений

Изменение размеров изображения может привести к возникновению артефактов на изображении, что отражается на его качестве.

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

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

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

Поворот изображений

Для поворота изображений используется функция imrotate. При использовании функции imrotate нужно указать два основных аргумента:

  1. изображение, которое нужно повернуть;
  2. угол поворота.

Угол поворота можно описать в градусах. Если задать положительное значение, то функция imrotate будет вращать изображение против часовой стрелки, если задать отрицательное значение, то функция imrotate буде вращать изображение по часовой стрелке. Рассмотрим пример поворота изображения I на 35 градусов против часовой стрелки.

J = imrotate(I,35);

В качестве необязательных аргументов в функции imrotate также можно описать

  1. метод интерполяции;
  2. размер результирующего изображения.

Описание метода интерполяции

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

Рассмотрим пример поворота изображения на 35° против часовой стрелки с использованием билинейной интерполяции.

I = imread("circuit.tif"); J = imrotate(I,35,"bilinear"); imshow(I) figure, imshow(J)

Описание размера результирующего изображения

По умолчанию, функция imrotate создает результирующее больше, так чтобы поместить исходное изображение, которое размещено под указанным углом. Пикселям, которые находятся за пределами изображения, устанавливается значение 0 и они являются фоном результирующего изображения. Если в функции imrotate в качестве аргумента указать опцию "crop", то результирующее изображение будет обрезано до размеров исходного изображения. Для более детальной информации см. описание функции imrotate.

Вырезание изображений

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

  1. исходное изображение;
  2. координаты прямоугольника, которым определяется площадь вырезания.

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

Imshow circuit.tif I = imcrop; imshow(I);

Выполнение основных пространственных преобразований

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

При использовании функции imtransform необходимо указать два основных аргумента:

  • исходное изображение;
  • структуру пространственных преобразований (TFORM), которая определяет тип нужных преобразований.

Описание типа преобразований

При описании типа преобразований необходимо использовать структуру TFORM. Существует два пути использования TFORM:

  • использование функции maketform;
  • использование функции cp2tform.

Использование maketform

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

Тип преобразования Описание
"affine" Преобразования, которые включают сдвиг, поворот, масштабирование и другие похожие функции преобразования изображений. При этом прямые линии остаются прямыми, параллельные остаются параллельными, а прямоугольник может превратиться в параллелограмм.
"box" Отдельный случай аффинных преобразований, когда каждая размерность масштабируется независимо.
"composite" Структура двух или более преобразований.
"custom" Преобразование, которое определено пользователем и вызывается с помощью функции imtransform.
"projective" При этом типе преобразований прямые линии остаются прямыми, а параллельные сходятся в одной точке. Эта точка может находиться как в пределах изображения, так и за его пределами.

Использование cp2tform

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

Примечание. При использовании функции imtransform структура TFORM выполняет двумерные пространственные преобразования. Если изображение содержит больше, чем две размерности, например, RGB изображения, то двумерные преобразования автоматически применяются ко всем двумерным составляющим. Для определения n-мерных преобразований используется функция tformarray.

Выполнение преобразований

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

Рассмотрим пример использования функции imtransform для выполнения проективных преобразований с изображением шахматной доски.

I = checkerboard(20,1,1); figure; imshow(I) T = maketform("projective",,... ); R = makeresampler("cubic","circular"); K = imtransform(I,T,R,"Size",,"XYScale",1); figure, imshow(K)

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

Линейная фильтрация и проектирование фильтров

Приложение Image Processing Toolbox содержит некоторое число функций, которые проектируют и реализуют двумерную линейную фильтрацию данных изображения. Рассмотри эти вопросы в таком порядке:

Рассмотрим еще некоторые термины, которые также буду в дальнейшем применяться при рассмотрении материала.

Термин Описание
Convolution (свертка) Операция над локальной окрестностью, где каждый результирующий пиксель представляет собой взвешенную сумму исходных пикселей. Вес определяется ядром свертки. С помощью операции свертки можно реализовать такие методы обработки изображений как сглаживание, повышение резкости и усиление границ объектов изображения.
convolution kernel (ядро свертки) Матрица весов, которая используется при выполнении свертки.
Correlation (корреляция) Операция над локальной окрестностью, где каждый результирующий пиксель представляет собой взвешенную сумму пикселей локальной окрестности. Весы определяются ядром корреляции. Понятие корреляции очень тесно связано с понятием свертки.
correlation kernel (ядро корреляции) Для реализации функции корреляции используется весовая функция. Ядра корреляции можно получить с помощью функции проектирования фильтров в Image Processing Toolbox. Ядра корреляции представляют собой ядро свертки, которое повернуто на 180 градусов.
FIR filter (фильтр с конечной импульсной характеристикой, КИХ-фильтр) В приложении существует ряд функций для расчета коэффициентов цифрового КИХ фильтра, в частности, методом Ремеза. Особенностью их использования является то, что исходные данные задаются в виде желаемой АЧХ произвольной сложности.
frequency response (частотная характеристика или частотный отклик) Математическая функция, с помощью которой можно оценивать работу фильтра на различных частотах.
neighborhood operation (операция с использованием значений соседних элементов) Операция, в результате которой значение каждого пикселя вычисляется на основе значений окрестных пикселей. Свертка, методы морфологической обработки и медианная фильтрация являются примерами операций с использованием соседних пикселей.
window method (локальные методы обработки) Методы обработки, при которых учитываются локальные особенности изображения.

Линейная фильтрация

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

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

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

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

  • Фильтрация с использованием convolution и correlation.
  • Выполнение фильтрации с использованием функции imfilter и др.

Свертка

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

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

A =

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

H =

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

  1. Развернуть ядро свертки на 180 градусов относительно центрального элемента.
  2. Умножить каждое значение веса в матрице свертки на соответствующее значение пикселя в матрице A.
  3. Просуммировать результат умножения.


Корреляция

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

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

В результате значение пикселя (2,4) будет равно


Вычисление значения результирующего пикселя (2,4)

Увеличение цифровых фотографий в несколько раз относительно их исходного размера в 300 PPI с сохранением резких деталей, вероятно, является основной целью многих алгоритмов интерполяции. Несмотря на эту общую цель, результаты масштабирования могут значительно варьироваться в зависимости от используемых программ и реализованных в них алгоритмов интерполяции и повышения резкости.

Основы

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

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

Обзор неадаптивной интерполяции

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

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

*стандартный алгоритм интерполяции в Adobe Photoshop CS и CS2


Диаграмма качества справа приблизительно показывает зону действия каждого из алгоритмов. Метод ближайшего соседа наиболее подвержен ступенчатости, однако он, а также билинейный метод наименее подвержены граничным гало - они отличаются лишь различным балансом между ступенчатостью и размытием. Вы увидите, как резкость границы постепенно нарастает между вариациями бикубического метода (3-5), но достигаются они за счёт увеличения ступенчатости и граничных гало. Метод Ланцоша выдаёт результаты, очень похожие на бикубический и бикубический резкий в Фотошопе, за исключением, возможно, несколько большей ступенчатости. Все они показывают некоторую степень ступенчатости, хотя ступенчатость всегда можно полностью исключить, использовав размывание изображения (7).

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

Обзор адаптивных методов

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

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

Стандартный алгоритм в Adobe Photoshop CS и CS2
всё ещё в фазе исследований, недоступен публично

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

Shortcut PhotoZoom Pro (ранее S-Spline Pro) - это ещё один распространённый фотоувеличитель. При интерполяции каждого пикселя он принимает в расчёт множество окружающих пикселей и пытается воссоздать гладкую границу, которая проходит через все известные пиксели. Для восстановления границ он использует алгоритм сплайна, который аналогичным образом применяется производителями автомобилей при разработке новых плавных обводов для своих машин. У PhotoZoom есть несколько разновидностей настройки - каждая предназначена для своего типа изображения.

Заметьте, как PhotoZoom выдаёт превосходные результаты на вышеприведенной компьютерной графике, поскольку он способен воспроизвести чёткую и гладкую границу без ступенек для всех кривых во флаге. Подлинные фракталы вносят мелкомасштабную текстуру, которой не было в оригинале, и их результат для данного примера ничем не лучше бикубической интерполяции. Стоит заметить, однако, что подлинные фракталы наилучшим образом справились с законцовками флага, тогда как PhotoZoom порой разбивает их на части. Единственный интерполятор, который сумел и выдержать гладкие чёткие границы, и аккуратные законцовки, - это SmartEdge.

Примеры из жизни

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


Метод ближайшего соседа Бикубический Бикубический мягкий PhotoZoom Подлинные фракталы SmartEdge
С повышением резкости: бикубический бикубический мягкий PhotoZoom (стандартный) подлинные фракталы SmartEdge

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

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

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

Повышаем резкость увеличенных фото

Наше внимание было сфокусировано на типе интерполяции. Однако техника повышения резкости может иметь как минимум эквивалентное влияние.

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

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

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

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

Повышение резкости и дистанция просмотра

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

Плотность пикселей типичного дисплея колеблется в пределах 70-100 PPI, в зависимости от настройки разрешения и размеров экрана. Стандартное значение 72 PPI при использовании вышеприведенного калькулятора означает радиус маски 0.3 пикселя - это обычный радиус, который используют для изображений, публикуемых на сайтах. Иначе, печатное разрешение 300 PPI (стандартное для фотопринтеров) выдаст радиус маски порядка 1.2 пикселя (тоже типичный).

Когда интерполяция становится важна

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

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

Вообще, это было вступлением к другой статье, но оно затянулось и вылилось в отдельный материал.

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

Для наглядного сравнения я буду использовать изображения одинакового разрешения 1920×1280 (одно , второе), которые буду приводить к размерам 330×220, 1067×667 и 4800×3200. Под иллюстрациями будет написано, сколько миллисекунд занял ресайз в то или иное разрешение. Цифры приведены лишь для понимания сложности алгоритма, поэтому конкретное железо или ПО, на котором они получены, не так важно.

Ближайший сосед (Nearest neighbor)

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

Вообще, качество и производительность любого метода уменьшения можно оценить по отношению количества пикселей, участвовавших в формировании конечного изображения, к числу пикселей в исходном изображении. Чем больше это отношение, тем скорее всего алгоритм качественнее и медленнее. Отношение, равное одному, означает что как минимум каждый пиксель исходного изображения сделал свой вклад в конечное. Но для продвинутых методов оно может быть и больше одного. Дак вот, если например мы уменьшаем изображение методом ближайшего соседа в 3 раза по каждой стороне, то это соотношение равно 1/9. Т.е. большая часть исходных пикселей никак не учитывается.




1920×1280 → 330×220 = 0,12 ms
1920×1280 → 1067×667 = 1,86 ms

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

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

Аффинные преобразования (Affine transformations)

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

Принцип действия заключается в том, что для каждой точки конечного изображения берется фиксированный набор точек исходного и интерполируется в соответствии с их взаимным положением и выбранным фильтром. Количество точек тоже зависит от фильтра. Для билинейной интерполяции берется 2x2 исходных пикселя, для бикубической 4x4. Такой метод дает гладкое изображение при увеличении, но при уменьшении результат очень похож на ближайшего соседа. Смотрите сами: теоретически, при бикубическом фильтре и уменьшении в 3 раза отношение обработанных пикселей к исходным равно 4² / 3² = 1,78. На практике результат значительно хуже т.к. в существующих реализациях окно фильтра и функция интерполяции не масштабируются в соответствии с масштабом изображения, и пиксели ближе к краю окна берутся с отрицательными коэффициентами (в соответствии с функцией), т.е. не вносят полезный вклад в конечное изображение. В результате изображение, уменьшенное с бикубическим фильтром, отличается от изображения, уменьшенного с билинейным, только тем, что оно еще более четкое. Ну а для билинейного фильтра и уменьшения в три раза отношение обработанных пикселей к исходным равно 2² / 3² = 0.44, что принципиально не отличается от ближайшего соседа. Фактически, аффинные преобразования нельзя использовать для уменьшения более чем в 2 раза. И даже при уменьшении до двух раз они дают заметные эффекты лесенки для линий.

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




1920×1280 → 330×220 = 6.13 ms
1920×1280 → 1067×667 = 17.7 ms
1920×1280 → 4800×3200 = 869 ms

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

Мое скромное мнение, что использование этого способа для произвольного уменьшения изображений попросту является багом , потому что результат получается очень плохой и похож на ближайшего соседа, а ресурсов на этот метод нужно значительно больше. Тем не менее, этот метод нашел широкое применение в программах и библиотеках. Самое удивительное, что этот способ используется во всех браузерах для метода канвы drawImage() (наглядный пример), хотя для простого отображения картинок в элементе используются более аккуратные методы (кроме IE, в нем для обоих случаев используются аффинные преобразования). Помимо этого, такой метод используется в OpenCV, текущей версии питоновской библиотеки Pillow (об этом я надеюсь написать отдельно), в Paint.NET.

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

Суперсемплинг (Supersampling)

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

Можно выделить два подвида этого метода: с округлением границ пикселей до ближайшего целого числа пикселей и без. В первом случае алгоритм становится малопригодным для масштабирования меньше чем в 3 раза, потому что на какой-нибудь один конечный пиксель может приходиться один исходный, а на соседний - четыре (2x2), что приводит к диспропорции на локальном уровне. В то же время алгоритм с округлением очевидно можно использовать в случаях, когда размер исходного изображения кратен размеру конечного, или масштаб уменьшения достаточно мал (версии разрешением 330×220 почти не отличаются). Отношение обработанных пикселей к исходным при округлении границ всегда равно единице.




1920×1280 → 330×220 = 7 ms
1920×1280 → 1067×667 = 15 ms
1920×1280 → 4800×3200 = 22,5 ms

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




1920×1280 → 330×220 = 19 ms
1920×1280 → 1067×667 = 45 ms
1920×1280 → 4800×3200 = 112 ms

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

Данный метод используется в функции gdImageCopyResampled() библиотеки GD, входящей в состав PHP, есть в OpenCV (флаг INTER_AREA), Intel IPP, AMD Framewave. Примерно по такому же принципу работает libjpeg, когда открывает изображения в уменьшенном в несколько раз виде. Последнее позволяет многим приложениям открывать изображения JPEG заранее уменьшенными в несколько раз без особых накладных расходов (на практике libjpeg открывает уменьшенные изображения даже немного быстрее полноразмерных), а затем применять другие методы для ресайза до точных размеров. Например, если нужно отресайзить JPEG разрешением 1920×1280 в разрешение 330×220, можно открыть оригинальное изображение в разрешении 480×320, а затем уменьшить его до нужных 330×220.

Свертки (Convolution)

Этот метод похож на аффинные преобразования тем, что используются фильтры, но имеет не фиксированное окно, а окно, пропорциональное масштабу. Например, если размер окна фильтра равен 6, а размер изображения уменьшается в 2,5 раза, то в формировании каждого пикселя конечного изображения принимает участие (2,5 * 6)² = 225 пикселей, что гораздо больше, чем в случае суперсемплинга (от 9 до 16). К счастью, свертки можно считать в 2 прохода, сначала в одну сторону, потом в другую, поэтому алгоритмическая сложность расчета каждого пикселя равна не 225, а всего (2,5 * 6) * 2 = 30. Вклад каждого исходного пикселя в конечный как раз определяется фильтром. Отношение обработанных пикселей к исходным целиком определяется размером окна фильтра и равно его квадрату. Т.е. для билинейного фильтра это отношение будет 4, для бикубического 16, для Ланцоша 36. Алгоритм прекрасно работает как для уменьшения, так и для увеличения.




1920×1280 → 330×220 = 76 ms
1920×1280 → 1067×667 = 160 ms
1920×1280 → 4800×3200 = 1540 ms

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

Именно этот метод реализован в ImageMagick, GIMP, в текущей версии Pillow с флагом ANTIALIAS.

Одно из преимуществ этого метода в том, что фильтры могут задаваться отдельной функцией, никак не привязанной к реализации метода. При этом функция самого фильтра может быть достаточно сложной без особой потери производительности, потому что коэффициенты для всех пикселей в одном столбце и для всех пикселей в одной строке считаются только один раз. Т.е. сама функция фильтра вызывается только (m + n) * w раз, где m и n - размеры конечного изображения, а w - размер окна фильтра. И наклепать этих функций можно множество, было бы математическое обоснование. В ImageMagick, например, их 15. Вот как выглядят самые популярные:

Билинейный фильтр (bilinear или triangle в ImageMagick)


Бикубический фильтр (bicubic , catrom в ImageMagick)


Фильтр Ланцоша (Lanczos)

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

Стоит задача: увеличить изображение 100х100 с четырмя каналами, (красный, зелёный, синий, альфа-канал; содержит сильно размытое пятно), до размера 2500х2500, и вывести на заранее подготовленный графический контекст устройства. Фактически кисть, наподобии кистей в графическом редакторе Adobe Photoshop. Проблема состоит как раз в увеличении (ресайзе). Вот исходное изображение (или кисть; показываю только альфа канал, остальное не принципиально):

Нарисовано стадартной кистью Photoshop.
А вот, что получается после увеличения моим алгоритмом (ещё раз: не обращайте внимания на цвет: он устанавливается рандомом). Я использовал ленийное интерполирование .
Вы тоже видите эти шероховатости? Так вот: вся проблема в них. Эти шерховатости находятся в альфа-канале, т.к. цвет у всей кисти однородный. Из-за них, при рисовании линии кистью, образуется страшная грязь. Чтобы понять природу этих неровностей, я решил нарисовать в Photoshop"е полоску шириной 1 пикс., представляющую собой плавный градиент от белого к синему, а потом снова к белому. Далее я увеличил по ширине каждую полоску сначала своим алгоритмом, потом в Photoshop"е: alt text http://plasmon.rghost.ru/38526229/image.png
alt text http://rghost.ru/38526272/image.png
На первом рисунке опять видно неровности. Вот почему, по моему мнению, возникают неровности:alt text http://rghost.ru/38526320/image.png
Здесь по оси x - номер пикселя, y - цвет. Синие точки - исходные, красные - аппроксимированнные линейной интерполяцией. Синий график показывают идеальную интерполяцию сплайнами, но она слишком долго выполняется на компьтере. Так вот, видите ломаный чёрный график линейной интерполяци? Вот эти самые углы ломаной, мне кажется, образуют такие шероховатости.

В Photoshop"е в настройках стоит интерполяция "Bicubic (best for smooth gradients)", но "Linear" и "Bicubic" в Photoshop"е дают одинаковый с моим алгоритмом результат. Так что можно считать, что "Bicubic (best for smooth gradients)" в Photoshop"е изображение сначала увеличивается линейной интерполяцией а потом применяется банальный фильтр размытия.

Итак. Все фильтры размытия которые я нашёл в интернете работают крайне медленно (в т.ч. мой). Скорее всего, Photoshop использует графический ускоритель. Но возможно ли как-нибудь реализовать мою задачу только с помощью CPU? И чтобы работало максимум секунду. Жду ваших предложений.

//горизонтальная интерполяция между исходными пикселами for y:=1 to setedbrush.h_orig do for x:= 1 to setedbrush.w_orig-1 do begin x_0:=round(x*k); x_x:=x_0+1; x_1:=round((x+1)*k); y_y:=round(y*k); while(x_x<>x_1) do begin cl:=round((temp.r-temp.r)/(x_1-x_0))+temp.r; temp.r:=cl; cl:=round((temp.g-temp.g)/(x_1-x_0))+temp.g; temp.g:=cl; cl:=round((temp.b-temp.b)/(x_1-x_0))+temp.b; temp.b:=cl; cl:=round((temp.a-temp.a)/(x_1-x_0))+temp.a; temp.a:=cl; inc(x_0); inc(x_x); end; end;

Здесь x_0 - крайний известный левый пиксел, соответственно x_1 - правый; x_x - расчитываемый пиксел, y_y - текущая строчка. Формула на основании подобия прямоугольных треугольников.

Результат уже лучше, чем прежде. Но при рисовании линии - грязь. Чтож, придётся сглаживать... Хотя, может быть, дело в картинке.

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

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

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

Вы должны признать, что снимок, сделанный с более высоким разрешением, будет содержать больше информации об изображении (то есть детали), чем изображение той же сцены, сделанное с более низким разрешением. Невозможно добавить эту информацию из воздуха. Алгоритмы масштабирования синтезируют некоторую информацию на основе предположения о непрерывности между элементами дискретного растрового изображения. Эта "новая" информация на самом деле не нова, но получена из ранее существовавшей информации о снимке, поэтому нельзя считать, что она имеет 100% вероятность совпадения исходной сцены. Более эффективные алгоритмы могут давать лучшие вероятности, но их результаты всегда будут иметь вероятность совпадения менее 1.

Один из способов увеличить разрешение - сделать несколько снимков, увеличить их до 4x ареалов (2x линейных в обоих направлениях) и использовать программное обеспечение стекирования для объединения изображений. Окончательное изображение будет лучше, чем любой из оригиналов.

Увеличение изображений рискованно. Вне определенной точки увеличение изображений - это безумное поручение; вы не можете магически синтезировать бесконечное количество новых пикселей из воздуха. И интерполированные пиксели никогда не бывают хорошими, как реальные пиксели. Вот почему это более чем искусственно, чтобы увеличить изображение Лены на 512x512 на 500%. Было бы разумнее найти более развернутое сканирование или изображение того, что вам нужно *, чем было бы увеличить его в программном обеспечении.

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

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

Если вам нужно сделать это алгоритмически, ознакомьтесь с ссылкой Image Scaling , предложенной Draemon. На какой платформе вы будете делать эти интерполяции? В большинстве графических библиотек будет реализовано множество подходов, позволяющих сбалансировать скорость и качество.