Le but de ce défi est de déterminer l'angle d'une ligne dans une image.
Règles sur l'image:
- Le fond de l'image sera blanc (
#FFFFFF
) - Le trait de la ligne sera noir (
#000000
) - La ligne ne sera PAS anti-aliasée
- L'image sera de 100x100 pixels
- La ligne commencera au centre de l'image
- La ligne commencera à pointer vers le bas (6-OClock)
- La ligne mesurera 50 pixels
- L'angle de la ligne sera mesuré dans le sens antihoraire à partir de la position de départ
- Le codec d'image sera soit
.jpg
ou.png
Le format d'entrée sera un nom de fichier transmis par l'argument de ligne de commande, l'entrée de script ou l'argument de fonction. Le format de sortie est simple - il suffit de sortir le nombre de degrés (par exemple 90
).
Les réponses peuvent être de ± 1 degré de la mesure indiquée. Voici quelques exemples d'images:
Une image de référence à 45 degrés sur fond gris
0 degrés
45 degrés
50 degrés
130 degrés
230 degrés
324 degrés
Voici le code utilisé pour créer les images (codé avec Processing ):
int deg = 45;
int centX = width/2, centY = height/2;
background(255);
noSmooth();
line(centX,
centY,
centX + sin(radians(deg))*50,
centY + cos(radians(deg))*50);
saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'
code-golf
image-processing
J Atkin
la source
la source
Réponses:
Pyth -
2826 octetsUtilise le même type de stratégie de force brute que la réponse js.
Prend l'entrée comme nom de fichier depuis stdin.
la source
JavaScript (ES6), 225
227244octetsLançons le bal:
Passez simplement l'URL de l'image à la fonction:
Alerte les degrés dans la plage ± 1. Passé tous les cas de test.
Non golfé
Modifications
la source
s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
file://
. Vous devez définir lacrossOrigin
propriété. De plus, cela ne fonctionnera pas si le chargement de l'image prend 0,00001 seconde de plus que la création du canevas. De plus, vous n'avez pas besoin def=
, coupant 2 octets. Mais c'est une belle solution en effet !!! Mon vote positif pour cela.onload
partie car j'étais à court d'un autre défi à cause de cela. J'ai donc pensé qu'il était normal de supposer qu'il se charge assez rapidement. En ce qui concerne la fonction anonyme, je ne sais pas comment la compter. Si je coupef=
et que je veux l'invoquer, je dois l'envelopper()
comme(s=>{})('arg');
. Puis-je ignorer cela dans le nombre d'octets?Matlab,
118104 octetsJe génère une matrice de la même taille que l'image avec des nombres complexes (0 au centre) et j'extrais de cette matrice les valeurs qui sont sur la ligne. L'argument de la moyenne de ceux-ci est alors affiché.
Merci à @ThomasKwa d'avoir suggéré une amélioration de la précision qui a également permis de raccourcir le code !!!
la source
Matlab,
8677 octetsVoici une autre façon d'utiliser Matlab:
Ceci lit le fichier (volé à flawr ) et trouve les indices des pixels noirs. Ensuite, il calcule le vecteur qui pointe du centre de l'image vers chaque pixel noir, et utilise
atan2d
pour trouver l'angle, l'arrondi pour obtenir des angles entiers et le fairemod(...,360)
pour obtenir des résultats dans la bonne plage. Pour obtenir l'angle correct (il y a un peu d'erreur pour les pixels proches du centre), prenez l'angle le plus souvent calculé.Merci à slvrbld pour la
im2bw
suggestion!la source
Labview, 10098 octets
Mettons un autre code labview là-bas.
Puisqu'il n'y a aucun moyen officiel de compter les octets dans labview, j'utilise la taille du fichier lorsqu'il est enregistré. Sinon, en comptant chaque fil et chaque fonction comme 1 et le cas comme 2, cela donnerait 71.
Chargez l'image, aplatissez à 1D, numérisez pour les 0 des deux côtés et prenez la première, calculez de nouveau au point et utilisez la géométrie pour obtenir l'angle.
la source
,
des décimales.