Программы для увеличения размеров цифрового изображения. Урок: масштабирование изображения. Программы и плагины для качественного увеличения изображения

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

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

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

Для наглядного сравнения я буду использовать изображения одинакового разрешения 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)

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

В этой статье 711 слов.

Навигация по записям

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

Те, кто печатал фото больше, чем 20 х 30 см. наверняка сталкивались с потерей детализации и банальным «замыливанием» картинки. Возможно вы думали, что это следствие недостаточного разрешения камеры и отчасти вы правы.

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

Adobe Photoshop давно вошёл в нашу жизнь и я сам уже не помню с какой версии я начинал (сейчас пользуюсь CS6). Этот программный продукт по удобству и наличию необходимых инструментов просто гениален.

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

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

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

Оригинал

Изначально фото имело разрешение 3580 х 5382 пикс. (19 Мпикс, был небольшой кроп).

Если следовать канонам печати, оно должно иметь 300dpi в файле для печати.

Если я сниму галочку «Resample» и поставлю 300dpi (т.е. не буду использовать средства увеличения изображения Adobe Photoshop), то фотошоп мне пересчитает размер результирующего отпечатка.

Для такого разрешения снимка он составит 30 х 45 см.

Но представим, что мы хотим с данном отпечатка почти без потери качества отпечатать баннер 3 х 6 м (300 х 600 см.) или 35800 х 53820 пикс. (1927 Мпикс = 1.9 Гпикс). 1.9 Гпикс в цифровой камере очень долго будут мечтой для подавляющего большинства и потому тема статьи так актуальна.

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

Все из вас знают, что у окошка изменения размеров изображения в Adobe Photoshop есть опции, в выпадающем меню внизу?

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

Первые два это особо старые алгоритмы и первый, Nearest Neighbor , Adobe Photoshop рекомендует для сохранения контрастных кромок в изображении.

Вкратце, если их описывать, то Bicubic Smoother даёт мягкие переходы между реальными пикселями, а Bicubic Sharper усиливает контраст кромок.

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

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

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

Фрагмент размером 607 пикселей в ширину. Я его увеличиваю до 3000 пикселей, т.е. в 5 раз.

Оригинал фрагмента

Nearest Neighbour vs Bicubic Smoother

Как видите, Nearest Neighbour даёт «лесенку», которую Bicubic Smoother размывает.

Программа PhotoZoom Pro 5

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

Я взял именно Bicubic Smoother в качестве алгоритма от Adobe, потому что они его рекомендуют. И «лесенки» на фото в наше время уже неприемлемы. Это же не 90-ые годы в конце концов!
Время пиксельных и спрайтовых игр уже ушло.

Из сравнения вы видите, что PhotoZoom Pro справился с задачей увеличения лучше. Но намного ли?

Alien Skin BlowUp2

И...PhotoZoom Pro5 побеждает!

ReShade

ReShade ставится как отдельная маленькая программа.

Старая программа ReShade (2011 г.)побеждает более современную и насыщенную алгоритмами PhotoZoom Pro . Я попробовал PhotoZoom Pro все алгоритмы и существенного улучшения не заметил. Только время потерял.

Так что у нас новый лидер — ReShade, с которым будем сравнивать оставшихся конкурентов.

Kneson Imagener

Отдельная программа. Интерфейс как будто из Win95.

AKVIS Magnifier

Плагин для Adobe Photoshop.

Интерфейс навороченный, а результат — плачевный.

Лидером оказался следующий плагин. Не зря я их давно выделял среди остальных...

OnOne Perfect Resize Professional Edition 7

Плагин для Adobe Photoshop.

ImageJ + plugin Resize

Слышал об том плагине, но не пробовал до сего момента.

Изменять размер нужно через меню «Plugins\Resize\Resize», метод «Least-Squares»

Результат не впечатлил. OnOne Perfect Resize побеждает.

Adobe Photoshop + bicubic sharper

В своей книге The Adobe Photoshop CS6 Book for Digital Photographers (у меня версия книги про CS6) Scott Kelby рекомендует использовать алгоритм bicubic sharper для увеличения фото вместо рекомендованного bicubic smoother .
Что ж...попробуем.

Результат не впечатлил. OnOne Perfect Resize побеждает.

Итоги

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

Разница между стандартным способом из Adobe Photoshop и OnOne Perfect Resize Professional Edition 7 большая и вполне заметная на печати.

2. Если вы соберетесь печатать совсем большие форматы, то учтите, что в СНГ сейчас принято использовать разрешение около 100 dpi для баннеров.

Для просто крупных изображений на выставку (1-2 м) используйте 150 dpi, если сложно получить больше. Расстояние просмотра, как правило, ограничено в 1-2 м. и с такого расстояния просмотра данное разрешение выглядит вполне приемлемо.

3. Если вы будете снимать на среднеформатный слайд, то сможете «вытащить» с него разрешения намного большем, чем с цифровой камеры. До 100 Мпикс.

4. Не забывайте о методах повышения резкости. Я в статье сравнил алгоритмы увеличения разрешения при отключенном увеличении резкости. Но к финальному отпечатку я, как правило, добавляю резкости. Конечно, не «в лоб», а, например, таким методом

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

Надеюсь данная статья поможет вам сделать красивые большие отпечатки ваших снимков!

Оцените, пожалуйста, статью

(40 votes, average: 4,73 out of 5)

Рекомендовать

Подписаться на RSS ленту

Читайте также:

Похожих статей не найдено


Добавить комментарий Отменить ответ

Войти с помощью:

Гости могут загрузить 2 картинки (можно отметить кликами левой кнопкой мыши на названиях файлов, с зажатой клавишей Ctrl ), размером не более 800KB каждая. Картинки должны быть форматов jpeg, pjpeg, png.

: 33 комментария

        • Роман, здравствуйте!

          Ваш «лайк» видно будет только, если вы зашли в аккаунт Гугл+ на другом компьютере тоже. Иначе Гугл+ вас не опознаёт и не показывает ваш «лайк».

          C1 добавлю завтра, предлагайте еще методы:) В поисках идеала...

          Изображение увеличил с 607 пикс -> 3000 пикс, т.е. в 5 раз.

          Я в статье упомянул, что 1.9 Гп мой компьютер просто не «переварит» в любом случае. Даже нет смысла пытаться.

          Если взять исходные размеры моего полного изображения (3580 х 5382), то получится 17900 х 26910 = 481 Мпикс (приличного качества).

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

          Идеально, чтобы не раздражать печатника и угодить редактору, стоит отдавать файлы максимум 33 Мпикс. 40-50 в крайнем случае, если редактор совсем не умеет считать (не понимает печатный процесс).

          Т.е. с одной стороны файл 33 Мпикс не так тяжело ворочать дизайнеру издания, а с другой, редактор (часто не понимающий какое на самом деле ему нужно разрешение) будет доволен высоким разрешением на уровне среднего цифрозадника Sinar/Leaf/PhaseOne. Убейте Exif и вот вы владелец виртуального цифрозадника (они не пишут Exif в файл).

          Если же мы говорим про баннер, то всё будет зависеть от мощности вашего компьютера, мощности компьютера типографии и сколько «переварит» рип (чаще не более 250мб) печатной машины. Кстати, будет еще вопрос, обеспечивает ли их печатная машина высокое разрешение. Обычно баннеры 3×6м печатают с максимальным разрешением 75 dpi дабы всем было легче жить.

          Если мы углубимся в теорию (назрела доп.статья?), то при печати баннера 3 х 6 метров и дистанции просмотра 5м (если я относительно близко подойду к рекламному щиту на ножке) минимальное разрешение для печати составит 17 dpi, а файл будет 30 Мпикс. Ближе, как правило, никто не подходит к таким большим баннерам.

          на остальное отвечу завтра...

          Присоединенная картинка:


            • Будучи залогиненным вконтакте нажимаю кнопку вконтакта и ссылка вообще сразу открывается, ничего не спрашивая...

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

              Кстати, комментарий должен был появиться на вашей странице в Гугл+! Если бы я мог вас там найти, то посмотрел бы, есть ли на стене комментарий.

              по фото:

              Увеличивал разрешение по стороне, как и написал 607px->3000px.

              Это достаточно много. Я график внизу прикладывал к сообщению.

              На мой взгляд C1 отчаянно врёт цвета:) Хотя они более приятные, чем в ACR. Что говорить... C1 использует устаревшие профили ICC, а ACR использует DCP-профили. LR не использую, но подозреваю, что результат одинаковый, что и с ACR.

              Пусть график вас так не расстраивает. Это график для идеального случая. Большинство с 0.5м не видят точки уже и на 150 dpi, как ни стараются.

              Ближе 0.5 никто не будет смотреть т.к. некомфортно носом в плакат.

              Если имеется в виду _на 80%_, т.е. 100%->180%, то разрешение упадёт соответственно 300 dpi->166dpi. Иначе говоря даже правильный ресайз делать не нужно, просто печатайте крупнее. С 0.5м никто разницы не увидит между 300 и 166.

              Увеличение в виде геометрической прогрессии (1 2 4 8...пикселов) вряд ли имеет смысл. Оно сильно избыточно. Увеличение 1 исходный пиксель равен 8 на выходе быссмысленно. Это будет «мыло мыльное».

              Про фотообои. Да, «накачивают» и панорамят. Причем чаще именно «накачивают» т.к. сшивка панорам требует относительно много времени.

              А печатник потом все равно разрешение урежет. У него не один клиент и ему нужно гнать поток. На высоком разрешении печатной машины и скорость печати очень низкая и расход краски большой. Вопрос экономии...

              Есть печальный опыт.

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

              Не знаю, сшивают ли фотообои, а вот баннеры сшивают. Редко где есть 5-ти метровые машины. Хорошая практика печатать файл на хорошем разрешении кусками, а потом сваривать куски. Разрешение это не повысит, но зато РИП машины переверит всю информацию и можно напечатать в максимальном для этой машины. Нет необходимости уменьшать, пока РИП не сможет его «переварить».

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

              3×4м можно сделать из обычного 20мп кадра. Качество весьма достойное (75-100 dpi)

              Я печатаю баннеры по 3м шириной с такого формата. Как правило баннеры бывают и больше, но там уже несколько картинок задействовано или есть текст (печатаю и 3×6м).

              Баннер от фотообоев в том аспекте, в котором мы его сейчас рассматриваем — ничем не отличается.

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

              Полиграфические материалы, к которым можно отнести фотообои (интерьерная печать) я даю обычно 150 dpi и этого вполне хватает. 300 dpi только для каталогов и то, бывает этого много. Но даю с запасом (в смысле 300dpi это уже с запасом!).

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

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

              Вывод: есть методы повышения разрешения (я написал их в статье) и они _достаточные_ для всех типов печати, чтобы «разогнать» разрешение.

              Для супер-высокого разрешение есть варианты снимать на крупноформатную камеру листовые пленки. В США так многие делают и потом можно напечатать размером с большую стену без потери разрешения. Также можно снимать ч.б. на специальные 35мм пленки типа SPU, Gigabit И проч. При правильной проявке детализация очень высокая, но придётся поступиться цветом. Цветные пленки, даже слайды, не дают такого разрешения. Нужно, как минимум. перейти на средний формат. С тех слайдов можно вытащить 100 Мпикс реальных.

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

              Если панорамить и увеличивать, то на каком этапе, увеличивать лучше? — ответ 2. При увеличении готового файла нагрузка на компьютер будет наименьшая. Сшивать несколько гигантских кусков куда как проблемнее...

              3 вариант — плохое качество увеличения.

              Статью подготовлю:)

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

              Присоединенная картинка:


Стоит задача: увеличить изображение 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 - текущая строчка. Формула на основании подобия прямоугольных треугольников.

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

Быстрый метод масштабирования цветных изображений.

Аннотация.

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

1) Введение.

Камеры разрешением 5 МПикс и более стали теперь уже обычным явлением. Технологии не стоят на месте, разрешения камер растут, но разрешения дисплеев мобильных устройств по понятным причинам не могут быть настолько же большими, следовательно, полученное камерой изображение должно быть вписано в меньший по разрешению экран, а это предполагает применение алгоритмов децимации. Бывают также случаи, когда размер изображения меньше размера экрана, или же требуется увеличить рисунок, чтобы рассмотреть интересующие детали. В таких случаях требуется увеличение изображения, а это можно осуществить интерполяционными методами. Известные методы децимации и интерполяции имеют низкую сложность и могут быть эффективно реализованы, однако очертания объектов изображения пострадают от эффекта зубчатости краёв и появившихся артефактов, поэтому хотелось бы получить алгоритм качественного масштабирования без нежелательных артефактов, неровных краёв, чрезмерного сглаживания и пикселизации.

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

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

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

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

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

2) Предлагаемые методы.

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

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

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

https://pandia.ru/text/78/197/images/image002_142.jpg" width="552" height="98">

Здесь input_image_size – размер источника, output_image_size – размер приёмника, panning – величина панорамирования, а zoom_factor определяет отношение размера источника к размеру приёмника. Panning – очень важная величина, которую следует учитывать в случаях, если изображение не помещается на экран полностью, а просматривается только некоторая «внутренность» границы, при этом её «внешность» обрезается, находясь за пределами экрана.

https://pandia.ru/text/78/197/images/image004_134.gif" width="461" height="264 src=">

Рис. 2. Значение пикселя уменьшенного изображения – взвешенное среднее пикселей источника, которые «принадлежат» области этого пикселя.

Теперь определим индикаторы (0, 0, 1, 0, …) и верхние индексы (1, 2, 3, …) так, как показано на рис. 2 и 3.

https://pandia.ru/text/78/197/images/image006_115.gif" width="506" height="227 src=">

Рис. 3. Верхние индексы и индикаторы.

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

https://pandia.ru/text/78/197/images/image008_94.gif" width="582" height="48 src=">

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

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

https://pandia.ru/text/78/197/images/image010_85.gif" width="257" height="310 src=">

Рис. 4. Веса

Весовые коэффициенты пропорциональны площади пересечения пикселя источника с пикселем приёмника. Веса вычисляются так:

https://pandia.ru/text/78/197/images/image012_80.gif" width="552" height="223 src=">

Здесь 1 ≤ x end .

Weight1 считаем левым весом, weight2 – правым. Сумма левого и правого весов должна равняться 1. Заметим, что веса и индексы вычисляем в целых числах. Это сделано для упрощения вычислений и сокращения объёма необходимой памяти. В формуле, приведённой выше, использована 10-разрядная точность (множидля преобразования вещественных значений в целые.

Индикатор первого пикселя источника равен 0, когда он не лежит на границе с первым уменьшенный пикселем или в случае, когда пиксель источника «проецируется» только на один из пикселей приёмника. Если же «проекция» приходится на 2 пикселя или левые границы пикселей источника и приемника идут точно по границе изображения, то индикатор устанавливается равным 1.

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

Как только веса и индексы по направлению х вычислены, приступаем к вычислению величин по у, пользуясь вышеприведёнными формулами.

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

https://pandia.ru/text/78/197/images/image014_68.gif" width="559" height="98 src=">

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

Значения пикселей каждой строки приёмника получаются путём сложения значений пикселей источника со значениями выходных буферов в каждой итерации цикла (см. рис. 5).

https://pandia.ru/text/78/197/images/image016_57.gif" width="496" height="305 src=">

Рис. 5. Буферизация.

Один пиксель источника затрагивает до четырёх пикселей приёмника (A, B, C, D) в зависимости от значений indexX и indexY. Если indexX = 0 и indexY = 0, то само значение пикселя источника добавляется в буфер (пиксель А, рис. 5). При indexX = 1 и indexY = 0, пиксель В вычисляется как взвешенное среднее пикселей источника и добавляется в соответствующий буфер. Если indexX = 0, а indexY = 1, то пиксель С вычисляется как взвешенное среднее входных пикселей и добавляется во второй буфер. Ну а в случае, если indexX и indexY равны одновременно 1, вычисляется пиксель D и добавляется во второй буфер.

Как только алгоритм пройдёт целиком по строке изображения, значения первого буфера преобразуются в 8-битные целые числа (0…255) делением на 1024 и записываются в выходной буфер. Если текущая строка источника влияет на две строки приёмника (indexY = 1) и если уменьшенная строка полностью занесена в буфер, её можно вывести уже на приёмник. После этого буферы 1 и 2 обмениваются своими значениями, и процесс повторяется для следующей строки.

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

Помимо низкой вычислительной нагрузки предлагаемый алгоритм использует только одну строку источника, 2 строки приёмника, 2 выходных буфера, 2 вектора верхних индексов (по одному на ширину и высоту) и 4 весовых вектора (по 2 на ширину и высоту источника). Как видим, алгоритм нетребователен к объёму памяти и очень удобен для портативных устройств.

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

https://pandia.ru/text/78/197/images/image018_47.gif" width="499" height="227 src=">

Рис. 6. Начальный и конечный пиксели.

Первый шаг алгоритма – определение начальных и конечных пикселей источника (см. рис. 6). Начальный пиксель вычисляется так:

https://pandia.ru/text/78/197/images/image020_49.gif" width="544" height="44 src=">

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

Нет необходимости рассчитывать индикатор конечного пикселя, так

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

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

https://pandia.ru/text/78/197/images/image022_49.gif" width="552" height="151 src=">

https://pandia.ru/text/78/197/images/image024_48.gif" width="552" height="317 src=">,

где 0 < x < destination_image_size .

Индикатор равен 1, если значение очередного интерполированного пикселя получается из очередной пары пикселей источника (т. е. центр очередного интерполированного пикселя расположен справа от центра правого пикселя текущей пары пикселей источника) и 0 в противном случае.

Приведённые выше формулы используются и для расчёта индексов и весов по вертикали.

Веса и индексы являются целыми числами. В нашем примере использована 10-битная точность как пример перевода вещественных чисел в целые. Заметим, что когда центр пикселя приёмника расположен слева или выше центра первого пикселя источника (start + x/zoom_factor < 0), алгоритму не хватает левых (верхних) пикселей для расчёта весов. Только первый пиксель источника используется для вычисления левого (верхнего) веса, а правый (нижний) вес полагается равным 0. Если же центр пикселя приёмника расположен справа или ниже центра последнего пикселя источника (input_image_size – 1 < start_pixel + x/zoom_factor), алгоритму не хватает правого (или нижнего) пикселя источника для расчёта весов. Последний пиксель источника используется для расчёта левого (или верхнего) веса, а правый (нижний) полагается равным 0.

Когда строка изображения полностью обработана по ширине, увеличенные пиксели делением на 1024 переводятся в 8-разрядные числа (0…255) и записываются в выходной буфер.

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

Панорамирование и обрезка границ.

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

Алгоритм начинается с вычисления первого и последнего пикселей в обоих направлениях (горизонтальном и вертикальном):

https://pandia.ru/text/78/197/images/image026_44.gif" width="544" height="80 src=">

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

3) Результаты.

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

https://pandia.ru/text/78/197/images/image028_39.gif" width="574" height="151 src=">

Табл. 1. Сравнение результатов тестирования различных методов. (а), (b) – минимальное и максимальное число операций на пиксель при уменьшения области 2*2 соответственно, (с) – число операций на пиксель при увеличении области 2*2.

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

Был также оценён объём необходимой памяти. Так как таблицы фильтрации заполняются до самого процесса масштабирования, то для процесса потребуется память только под 2 строки изображения вне зависимости от метода фильтрации, будь то метод ближайшего соседа, билинейная или бикубическая фильтрация. К примеру, масштабирование 8-разрядного цветного VGA-изображения потребует 2*3*640*8 бит памяти, а изображение разрешением 1 МПикс – 2*3*1024*8 бит.

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

https://pandia.ru/text/78/197/images/image030_39.gif" width="560" height="423 src=">

https://pandia.ru/text/78/197/images/image032_35.gif" width="559" height="423 src=">

Рис. 7. Пример работы алгоритма уменьшения масштаба.

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

4) Заключение.

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

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

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

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

В приложении 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)