Любой фотограф- любитель может сказать, что экстремальная пост-обработка всегда хороша. Одна из таких техник называется « миниатюрная фальсификация ».
Цель состоит в том, чтобы сделать изображение похожим на фотографию миниатюрной, игрушечной версии самого себя. Это лучше всего подходит для фотографий, снятых под умеренным / большим углом к земле, с малой дисперсией высоты объекта, но может применяться с различной эффективностью к другим изображениям.
Задача: сделать фотографию и применить к ней миниатюрный алгоритм подделки. Есть много способов сделать это, но для целей этой задачи, это сводится к:
Выборочное размытие
Некоторая часть изображения должна быть размытой, чтобы имитировать малую глубину резкости. Это обычно делается вдоль некоторого градиента, линейного или в форме. Выберите любой алгоритм размытия / градиента, который вам нравится, но между 15-85% изображения должно быть "заметное" размытие.
Повышение насыщенности
Увеличьте цвет, чтобы вещи выглядели так, как будто они были нарисованы вручную. Выход должен иметь средний уровень насыщения> + 5% по сравнению с входом. (с использованием HSV насыщения )
Повышение контрастности
Увеличьте контрастность, чтобы имитировать более жесткие условия освещения (например, при освещении в помещении / студии, а не на солнце). Выход должен иметь контраст> + 5% по сравнению с вводом. (используя алгоритм RMS )
Эти три изменения должны быть реализованы, и никакие другие улучшения / изменения не допускаются. Нет обрезки, резкости, регулировки баланса белого, ничего.
Ввод - это изображение, и его можно прочитать из файла или памяти. Вы можете использовать внешние библиотеки для чтения и записи изображения, но вы не можете использовать их для обработки изображения. Поставленные функции также запрещены для этой цели (вы не можете просто вызвать,
Image.blur()
например)Там нет другого ввода. Сила обработки, уровни и т. Д. Должны определяться программой, а не человеком.
Вывод может быть отображен или сохранен как файл в стандартном формате изображения (PNG, BMP и т. Д.).
Попробуйте обобщить. Он не должен работать только на одном изображении, но понятно, что он не будет работать на всех изображениях. Некоторые сцены просто плохо реагируют на эту технику, независимо от того, насколько хорош алгоритм. Примените здравый смысл здесь, как при ответе, так и при голосовании за ответы.
Поведение не определено для неправильных входных данных и тех изображений, которые невозможно удовлетворить спецификации. Например, изображение в градациях серого не может быть насыщенным (базовый оттенок отсутствует), чисто белое изображение не может иметь повышенную контрастность и т. Д.
Включите в ответ как минимум два выходных изображения:
Один должен быть создан из одного из изображений в этой папке Dropbox . Есть шесть на выбор, но я постарался сделать их жизнеспособными в разной степени. Вы можете увидеть примеры выходных данных для каждого в
example-outputs
подпапке. Обратите внимание, что это полные 10-мегапиксельные изображения JPG прямо из камеры, поэтому у вас есть много пикселей для работы.Другим может быть любое изображение на ваш выбор. Очевидно, попробуйте выбрать изображения, которые можно свободно использовать. Кроме того, включите либо оригинальное изображение или ссылку на него для сравнения.
Например, из этого изображения:
Вы можете вывести что-то вроде:
Для справки, приведенный выше пример был обработан в GIMP с угловым градиентом в виде прямоугольника размытия по Гауссу, насыщенность +80, контрастность +20. (Я не знаю, какие единицы использует GIMP для них)
Чтобы получить больше вдохновения или получить лучшее представление о том, чего вы хотите достичь, посетите этот сайт или этот . Вы также можете искать miniature faking
и tilt shift photography
для примеров.
Это конкурс популярности. Избиратели, проголосуйте за записи, которые выглядят лучше всего, оставаясь верными цели.
Разъяснение:
Уточняя, какие функции запрещены, я не собирался запрещать математические функции. Моим намерением было запретить функции манипулирования изображениями . Да, там есть некоторые совпадения, но такие вещи, как БПФ, свертки, матричная математика и т. Д., Полезны во многих других областях. Вы не должны использовать функцию, которая просто берет изображение и размывает. Если вы найдете подходящий математический способ создать размытие, то это честная игра.
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, иImageAdjust
.) Даже с помощью таких обработок изображений функций высокого уровня, код занимает до 22 K. Код для пользовательского интерфейса, тем не менее, очень маленький.Ответы:
Java: эталонная реализация
Вот базовая справочная реализация в Java. Лучше всего работает на снимках под большим углом, и это ужасно неэффективно.
Размытие - это очень простое размытие в рамке, поэтому оно повторяет одни и те же пиксели гораздо больше, чем необходимо. Контрастность и насыщенность также могут быть объединены в один цикл, но подавляющее большинство времени затрачивается на размытие, поэтому от этого не получится большой выгоды. При этом, он работает довольно быстро на изображениях под 2MP или около того. Изображение 10MP заняло некоторое время для завершения.
Качество размытия можно легко улучшить с помощью практически все, кроме размытия плоской рамки. Алгоритмы контрастности / насыщенности делают свое дело, поэтому никаких реальных нареканий нет.
В программе нет реального интеллекта. Он использует постоянные факторы для размытия, насыщенности и контрастности. Я поиграл с этим, чтобы найти счастливые средние настройки. В результате там есть некоторые сцены , что он не делает очень хорошо. Например, он накачивает контрастность / насыщенность настолько, что изображения с большими областями одинакового цвета (например, небо) распадаются на цветные полосы.
Это просто в использовании; просто передайте имя файла в качестве единственного аргумента. Он выводит в формате PNG независимо от того, каким был входной файл.
Примеры:
Из выпадающего списка:
Эти первые изображения уменьшены для удобства размещения. Нажмите на изображение, чтобы увидеть в полном размере.
После:
До:
Разный выбор:
После:
До:
источник
C #
Вместо того, чтобы делать какие-либо итеративные размытия в рамке, я решил пройти весь путь и написать размытие по Гауссу. Эти
GetPixel
вызовы действительно замедлить при использовании больших ядер, но это на самом деле не стоит , чтобы преобразовать методы к использованиюLockBits
, если мы не были обрабатывать несколько больших изображений.Ниже приведены некоторые примеры, которые используют параметры настройки по умолчанию, которые я установил (я не слишком много играл с параметрами настройки, потому что они, казалось, хорошо работали для тестового изображения).
Для тестового примера предусмотрено ...
Другая...
Другая...
Увеличение насыщенности и контрастности должно быть довольно простым из кода. Я делаю это в пространстве HSL и конвертирую обратно в RGB.
Ядро 2D Gaussian генерируется на основе размера
n
указано, с:... и нормализуется после назначения всех значений ядра. Обратите внимание, что
A=sigma_x=sigma_y=1
.Чтобы выяснить, где применять ядро, я использую вес размытия, рассчитанный по формуле:
... который дает достойный отклик, по существу создавая эллипс значений, которые защищены от размытия, которое постепенно исчезает дальше. Полосовой фильтр в сочетании с другими уравнениями (возможно, какой-то вариант
y=-x^2
) может потенциально работать лучше для определенных изображений. Я пошел с косинусом, потому что он дал хороший ответ для базового случая, который я проверял.источник
Джава
Использует быструю среднюю двухстороннюю размытость, чтобы быть достаточно быстрой, чтобы выполнить несколько проходов, эмулируя размытие по Гауссу. Размытие - это эллиптический градиент, а не билинейный.
Визуально это лучше всего работает на больших изображениях. Имеет более темную, грубую тему. Я доволен тем, как размытие получилось на изображениях соответствующего размера, оно довольно постепенное и трудно различить, где оно «начинается».
Все вычисления выполняются на массивах целых или двойных чисел (для HSV).
Ожидает путь к файлу в качестве аргумента, выводит файл в то же место с суффиксом «miniaturized.png». Также отображает ввод и вывод в JFrame для немедленного просмотра.
(нажмите, чтобы увидеть большие версии, они намного лучше)
До:
После:
Возможно, мне придется добавить более умное отображение тонов или сохранение яркости, так как это может стать довольно темным:
До:
После:
Тем не менее, интересно, ставит его в совершенно новую атмосферу.
Код:
источник
J
Это был хороший вызов. Настройки размытия, насыщенности и контрастности жестко запрограммированы, но при желании их можно легко изменить. Однако область в фокусе жестко закодирована как горизонтальная линия в центре. Его нельзя просто изменить, как другие настройки. Он был выбран, поскольку большинство тестовых изображений имеют вид на город.
Выполнив размытие по Гауссу, я разделил изображение по горизонтали на 5 областей. Верхняя и нижняя области получат 100% размытия. Средний регион получит 0% размытия. Две оставшиеся области будут масштабироваться пропорционально обратному кубу от 0% до 100%.
Код должен использоваться как сценарий в J, и этот сценарий будет находиться в той же папке, в
input.bmp
которой будет входное изображение. Это создастoutput.bmp
который будет поддельный миниатюрная входа.Производительность хорошая, и на моем компьютере, использующем i7-4770k, обработка изображения из набора ОП занимает около 20 секунд. Раньше обработка изображения с использованием стандартной свертки с
;._3
оператором subarray занимала около 70 секунд . Производительность была улучшена с помощью FFT для выполнения свертки.Этот код требует
bmp
иmath/fftw
дополнения должны быть установлены. Вы можете установить их, используяinstall 'bmp'
иinstall 'math/fftw'
. Вашей системе также может потребоваться установитьfftw
библиотеку.источник