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!