Comme tout photographe amateur peut vous le dire, un post-traitement extrême est toujours bon. Une de ces techniques est appelée " simulation de miniature ".
Le but est de faire ressembler une image à une photographie d'une version miniature et jouet d'elle-même. Cela fonctionne mieux pour les photographies prises d'un angle modéré / élevé au sol, avec une faible variation de la hauteur du sujet, mais peut être appliquée avec une efficacité variable à d'autres images.
Le défi: prendre une photo et lui appliquer un algorithme de simulation de miniatures. Il existe de nombreuses façons de le faire, mais pour les besoins de ce défi, cela se résume à:
Flou sélectif
Une partie de l'image doit être floue pour simuler une faible profondeur de champ. Cela se fait généralement le long d'un certain gradient, qu'il soit linéaire ou façonné. Choisissez l'algorithme de flou / gradient que vous aimez, mais entre 15 et 85% de l'image doit avoir un flou "perceptible".
Boost de saturation
Augmentez la couleur pour faire apparaître les objets peints à la main. La sortie doit avoir un niveau de saturation moyen de> + 5% par rapport à l'entrée. (en utilisant la saturation HSV )
Augmentation du contraste
Augmentez le contraste pour simuler des conditions d'éclairage plus dures (comme vous le voyez avec une lumière intérieure / de studio plutôt qu'avec le soleil). La sortie doit avoir un contraste de> + 5% par rapport à l'entrée. (en utilisant l' algorithme RMS )
Ces trois modifications doivent être mises en œuvre et aucune autre amélioration / modification n'est autorisée. Aucun recadrage, netteté, réglages de la balance des blancs, rien.
L'entrée est une image et peut être lue à partir d'un fichier ou d'une mémoire. Vous pouvez utiliser des bibliothèques externes pour lire et écrire l'image, mais vous ne pouvez pas les utiliser pour traiter l'image. Les fonctions fournies sont également interdites à cette fin (vous ne pouvez pas simplement appeler
Image.blur()
par exemple)Il n'y a pas d'autre entrée. Les forces de traitement, les niveaux, etc., doivent être déterminés par le programme et non par un être humain.
La sortie peut être affichée ou enregistrée sous forme de fichier dans un format d'image standardisé (PNG, BMP, etc.).
Essayez de généraliser. Il ne devrait pas fonctionner sur une seule image, mais il est compréhensible qu'il ne fonctionne pas sur toutes les images. Certaines scènes ne répondent tout simplement pas bien à cette technique, quelle que soit la qualité de l'algorithme. Faites preuve de bon sens ici, à la fois pour répondre et voter sur les réponses.
Le comportement n'est pas défini pour les entrées non valides et les images qui sont impossibles à satisfaire à la spécification. Par exemple, une image en niveaux de gris ne peut pas être saturée (il n'y a pas de teinte de base), une image en blanc pur ne peut pas avoir un contraste accru, etc.
Incluez au moins deux images de sortie dans votre réponse:
L'une doit être générée à partir d'une des images de ce dossier de liste déroulante . Il y en a six parmi lesquels choisir, mais j'ai essayé de les rendre tous viables à des degrés divers. Vous pouvez voir des exemples de sorties pour chacun dans le
example-outputs
sous - dossier. Veuillez noter que ce sont des images JPG 10MP complètes directement de l'appareil photo, vous avez donc beaucoup de pixels sur lesquels travailler.L'autre peut être n'importe quelle image de votre choix. Évidemment, essayez de choisir des images librement utilisables. Incluez également l'image d'origine ou un lien vers celle-ci pour comparaison.
Par exemple, à partir de cette image:
Vous pourriez produire quelque chose comme:
Pour référence, l'exemple ci-dessus a été traité dans GIMP avec un flou gaussien dégradé en forme de boîte angulaire, saturation +80, contraste +20. (Je ne sais pas quelles unités GIMP utilise pour celles-ci)
Pour plus d'inspiration ou pour avoir une meilleure idée de ce que vous essayez de réaliser, consultez ce site ou celui-ci . Vous pouvez également rechercher miniature faking
et tilt shift photography
rechercher des exemples.
Il s'agit d'un concours de popularité. Électeurs, votez pour les entrées qui vous semblent les plus belles tout en restant fidèles à l'objectif.
Clarification:
Précisant quelles fonctions sont interdites, je n'avais pas l'intention d'interdire les fonctions mathématiques . J'avais l'intention d'interdire les fonctions de manipulation d'images . Oui, il y a un certain chevauchement, mais des choses comme la FFT, les convolutions, les mathématiques matricielles, etc., sont utiles dans de nombreux autres domaines. Vous ne devez pas utiliser une fonction qui prend simplement une image et brouille. Si vous trouvez un moyen mathématique approprié pour créer un flou, ce jeu équitable.
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, etImageAdjust
). Même avec l'aide de ces fonctions de traitement d'image de haut niveau, le code prend 22 k. Le code de l'interface utilisateur est néanmoins très petit.Réponses:
Java: implémentation de référence
Voici une implémentation de référence de base en Java. Il fonctionne mieux sur les prises de vue en plongée et il est horriblement inefficace.
Le flou est un flou de boîte très basique, donc il boucle sur les mêmes pixels beaucoup plus que nécessaire. Le contraste et la saturation peuvent également être combinés en une seule boucle, mais la grande majorité du temps passé est sur le flou, donc il n'y aurait pas beaucoup de gain à cela. Cela étant dit, cela fonctionne assez rapidement sur les images sous 2MP ou plus. L'image 10MP a pris un certain temps.
La qualité du flou pourrait facilement être améliorée en utilisant pratiquement tout sauf un flou de boîte plate. Les algorithmes de contraste / saturation font leur travail, donc rien à redire là-bas.
Il n'y a pas de véritable intelligence dans le programme. Il utilise des facteurs constants pour le flou, la saturation et le contraste. J'ai joué avec lui pour trouver des réglages de milieu heureux. En conséquence, il y a des scènes qui ne fonctionnent pas très bien. Par exemple, il pompe le contraste / la saturation à tel point que les images avec de grandes zones de couleur similaire (pensez au ciel) se décomposent en bandes de couleur.
C'est simple à utiliser; passez simplement le nom du fichier comme seul argument. Il sort en PNG quel que soit le fichier d'entrée.
Exemples:
Dans la liste déroulante:
Ces premières images sont réduites pour faciliter la publication. Cliquez sur l'image pour voir en taille réelle.
Après:
Avant:
Sélection divers:
Après:
Avant:
la source
C #
Au lieu de faire des flous de boîte itératifs, j'ai décidé d'aller jusqu'au bout et d'écrire un flou gaussien. Les
GetPixel
appels le ralentissent vraiment lors de l'utilisation de grands noyaux, mais cela ne vaut pas vraiment la peine de convertir les méthodes à utiliser àLockBits
moins que nous ne traitions des images plus grandes.Quelques exemples sont ci-dessous, qui utilisent les paramètres de réglage par défaut que j'ai définis (je n'ai pas beaucoup joué avec les paramètres de réglage, car ils semblaient bien fonctionner pour l'image de test).
Pour le cas de test fourni ...
Un autre...
Un autre...
La saturation et le contraste augmentent devraient être assez simples à partir du code. Je fais cela dans l'espace HSL et le reconvertis en RVB.
Le noyau gaussien 2D est généré en fonction de la taille
n
spécifiée, avec:... et normalisé une fois que toutes les valeurs du noyau ont été attribuées. Notez cela
A=sigma_x=sigma_y=1
.Afin de savoir où appliquer le noyau, j'utilise un poids de flou, calculé par:
... ce qui donne une réponse décente, créant essentiellement une ellipse de valeurs protégées du flou qui s'estompe progressivement. Un filtre passe-bande combiné à d'autres équations (peut-être une variante de
y=-x^2
) pourrait potentiellement mieux fonctionner ici pour certaines images. Je suis allé avec le cosinus car il a donné une bonne réponse pour le cas de base que j'ai testé.la source
Java
Utilise un flou de boîte bidirectionnelle à moyenne rapide pour être suffisamment rapide pour exécuter plusieurs passes, émulant un flou gaussien. Le flou est également un gradient elliptique au lieu d'être bi-linéaire.
Visuellement, cela fonctionne mieux sur de grandes images. A un thème plus sombre et plus grungier. Je suis satisfait de la façon dont le flou s'est avéré sur des images de taille appropriée, il est assez progressif et difficile de discerner où il "commence".
Tous les calculs effectués sur des tableaux d'entiers ou de doubles (pour HSV).
Attend le chemin du fichier comme argument, envoie le fichier au même emplacement avec le suffixe "miniaturized.png" Affiche également l'entrée et la sortie dans un JFrame pour une visualisation immédiate.
(cliquez pour voir les grandes versions, elles sont bien meilleures)
Avant:
Après:
Je devrais peut-être ajouter un mappage de ton plus intelligent ou une préservation de la luma, car cela peut devenir assez sombre:
Avant:
Après:
Toujours intéressant cependant, le met dans une toute nouvelle atmosphère.
Le code:
la source
J
C'était un beau défi. Les paramètres de flou, de saturation et de contraste sont codés en dur mais peuvent être facilement modifiés si vous le souhaitez. Cependant, la zone mise au point est codée en dur comme une ligne horizontale au centre. Il ne peut pas être simplement modifié comme les autres paramètres. Il a été choisi car la plupart des images de test présentent des vues à travers une ville.
Après avoir effectué un flou gaussien, j'ai divisé l'image horizontalement en 5 régions. Les régions supérieure et inférieure recevront 100% du flou. La région du milieu recevra 0% du flou. Les deux régions restantes évolueront toutes deux proportionnellement au cube inverse de 0% à 100%.
Le code doit être utilisé comme script dans J et ce script sera dans le même dossier que celui
input.bmp
qui sera l'image d'entrée. Il créeraoutput.bmp
qui sera une fausse miniature de l'entrée.Les performances sont bonnes et sur mon PC utilisant un i7-4770k, il faut environ 20 secondes pour traiter une image de l'ensemble OP. Auparavant, il fallait environ 70 secondes pour traiter une image à l'aide d'une convolution standard avec l'
;._3
opérateur de sous-réseau. Les performances ont été améliorées en utilisant la FFT pour effectuer la convolution.Ce code nécessite que les addons
bmp
etmath/fftw
soient installés. Vous pouvez les installer en utilisantinstall 'bmp'
etinstall 'math/fftw'
. Votre système peut également nécessiter l'fftw
installation de la bibliothèque.la source