Votre tâche consiste à écrire un programme qui prend une image d'entrée et à l'exécuter via la détection des contours pour devenir une image de sortie.
La détection des contours fonctionne comme suit (si elle n'est pas claire, voir Détection des contours sobel ):
- La valeur d'un pixel est la luminosité totale d'un pixel, donc s'il est en couleur, vous devrez d'abord le convertir en niveaux de gris (pour garder les choses simples et aptes au golf, vous pouvez prendre la valeur moyenne pour R, G et B).
- Les formules pour G x et G y pour le pixel p (i, j) sont:
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j +1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- La valeur de la taille du bord à ce pixel est alors: √ (G x 2 + G y 2 )
L'image de sortie est pour chaque pixel la taille du bord √ (G x 2 + G y 2 ) en échelle de gris.
Bonus:
- Effectuez un flou gaussien pour lisser l'image avant que la détection des bords ne se déclenche, pour omettre les bords plus petits. Cela donne un bonus de -30% sur le résultat final.
- Tenez compte de l'angle du bord. Vous donnez au pixel de sortie une certaine couleur, en prenant la même valeur d'échelle de gris et en ajoutant de la couleur à partir d'une roue chromatique en utilisant l'angle obtenu à partir de la formule arctan (G y / G x ). Cela donne un autre bonus de -30% sur le résultat final.
Règles:
- Vous pouvez omettre la valeur des pixels de contour et les définir sur noir, ou vous pouvez utiliser 0 pour tout pixel en dehors de l'image.
- Votre image de sortie doit être dans un format d'image pouvant être ouvert sur la plupart des ordinateurs.
- La sortie doit être écrite sur le disque ou raccordée à un fichier.
- L'entrée est donnée sous forme d'argument de ligne de commande, sous la forme d'un chemin d'accès relatif à l'image, ou via la ligne de commande.
- C'est le golf de code, donc le code le plus court en octets gagne!
Réponses:
J,
166 164 161 154 154 150 144143 octets.Pas trop joué au golf; J'ai principalement réduit mon implémentation plus longue (voir ci-dessous), donc il y a probablement beaucoup de place pour l'amélioration. Utilise la bibliothèque BMP. Enregistre le résultat dans le fichier
o
. J'ai manipulé les pixels de bord en utilisant uniquement des cellules 3x3 complètes, de sorte que l'image finale a une largeur et une hauteur plus petites de 2 pixels.Usage:
Étendu:
Exemple d'entrée et de sortie:
la source
;._3
opérateur de sous - tableau. J'ai remarqué que vous avez défini un verbep
de rang 2 pour opérer sur les sous-réseaux après les avoir créés. Vous pouvez plutôt opérer sur chaque sous-réseau lorsque vous coupez. Mon essai de l'implémenter en fonction de votre travail est256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Cela devrait le ramener à 126 octets au total.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
supposant que seul le nom de fichier est entré sur stdin. Vous pouvez effectuer cette opération à l'aide deecho -n
sorte qu'une nouvelle ligne supplémentaire ne soit pas incluse dans stdin. Sur mon ordinateur, le script se ferme automatiquement lors de l'utilisation d'une entrée redirigée vers un script, ce qui signifie que je n'ai pas à inclure leexit''
et peut enregistrer 6 octets supplémentaires, mais je ne suis pas sûr que ce soit vrai pour tous.Python, 161 * 0,7 = 112,7 octets
Avec le bonus Flou gaussien.
Comme vous n'avez pas explicitement interdit les méthodes intégrées, voici OpenCV:
Sans bonus, 136 octets
la source
MATLAB, 212 * 0,4 = 84,8 octets
Utilisation de la boîte à outils du filtre et de l'espace colorimétrique HSV
ou non golfé
la source
Love2D Lua, 466 octets
Prend l'entrée de ligne de commande, les sorties dans un fichier appelé "o" sous votre dossier appsdata Love2D. Love2D ne vous permettra pas d'enregistrer des fichiers ailleurs.
À peu près aussi golfé que possible, je pourrais probablement le faire plus loin.
Expliqué
Tester
Et...
Bien que cela n'améliore pas réellement mon score (le rend pire en fait), voici la version avec la roue chromatique implémentée.
900 - 270 = 630 octets
la source