2017-03-06 7 views
0

Ich versuche, den nächsten Punkt zum Punkt (in diesem Fall rot) in diesem Bild zu finden. In diesem Bild finden diese Ausgabe die erste Zeile Punkt von rechtsFinden Sie den nächsten Punkt horizontal in ImageMagick?

, wie ich dieses

enter image description here

Ausgang tun konnte mich

enter image description here

Bitte helfen.

+1

Kennen Sie die Koordinaten des roten Punktes? Kennen Sie die Farben "Hintergrund" und "Linie" genau? –

+0

ja ich kenne die Koordinaten des roten Punktes – victorhernandezzero

+0

ich kenne die Linienfarbe – victorhernandezzero

Antwort

1

Das sieht lustig aus! Lassen Sie uns das Bild Dump ImageMagick in Text mit:

convert image.png txt: 

# ImageMagick pixel enumeration: 337,218,65535,srgb 
0,0: (65535,65535,65535) #FFFFFF white 
1,0: (65535,65535,65535) #FFFFFF white 
2,0: (65535,65535,65535) #FFFFFF white 
3,0: (65535,65535,65535) #FFFFFF white 
4,0: (65535,65535,65535) #FFFFFF white 
... 
... 
221,79: (0,0,0) #000000 black 
221,80: (0,0,0) #000000 black 
221,81: (0,0,0) #000000 black 
221,82: (0,0,0) #000000 black 
... 
... 

Ok, jetzt lassen Sie uns awk verwenden, um alle schwarzen Pixel zu finden und drucken ihre (x, y) Koordinaten:

convert image.png txt: | awk -F'[,:]' '/black/{x=$1;y=$2;print x,y}' 

221 79 
221 80 
221 81 
221 82 
221 83 
221 84 
... 
... 

Ok, jetzt lasst uns Erzähle awk wo das rote Pixel ist, indem rx (rote X-Koordinate) und ry (rote Y-Koordinate) übergeben werden. Berechnen Sie dann auch die Summe der Quadrate der x-Entfernung und der y-Entfernung von rot zu jedem schwarzen Pixel. Wenn es weniger ist (d. H. Näher) als bisher gesehen, speichern Sie den Ort. Drucken Sie den nächstgelegenen Standort am Ende aus.

convert image.png txt: | awk -F'[,:]' -v rx=318 -v ry=127 ' 
    BEGIN{m=999999} 
    /black/{ 
      x=$1; y=$2; d2=(rx-x)*(rx-x)+(ry-y)*(ry-y) 
      if(d2<m){m=d2;xm=x;ym=y} 
    } 
    END{print xm,ym}' 

277 127 

Also, das ist die Antwort ... (277,127). Sagen wir es überprüfen, indem Sie einen Cyan-Kreis zeichnen dort:

convert image.png -fill cyan -draw "circle 277,127 277,132" check.png 

enter image description here


Auf Re-Lektüre die Frage stelle ich fest, dass man eigentlich nur die horizontal am nächsten Punkt wollen, während meine Lösung oben für die bedient allgemeiner Fall in irgendeiner Richtung. Wenn Sie nur horizontal versetzt werden soll, und Sie wissen, dass die horizontale Linie bei y-Koordinate 127, können Sie extrahieren nur, dass bestimmte Zeile aus dem Bild und vereinfachen Dinge wie diese:

convert image.png -crop x1+0+127 txt: | awk -F'[,:]' -v rx=318 ' 
    BEGIN{m=999999} /black/{x=$1;d=(rx-x)*(rx-x);if(d<m){m=d;xm=x}} END{print xm}' 
277 

Wenn Sie nicht awk mögen Sie können es nur durch Augapfel ...

convert image.png -crop x1+0+127 txt: | grep -E "black|red" 

221,0: (0,0,0) #000000 black 
277,0: (0,0,0) #000000 black   <--- nearest black to red 
314,0: (65535,0,0) #FF0000 red 
315,0: (65535,0,0) #FF0000 red 
316,0: (65535,0,0) #FF0000 red 
317,0: (65535,0,0) #FF0000 red 
318,0: (65535,0,0) #FF0000 red 
319,0: (65535,0,0) #FF0000 red 
320,0: (65535,0,0) #FF0000 red 

Wie habe ich die Koordinaten des roten Pixels finden? Ich benutzte ImageMagick ‚s Unterbild-Suche nach einem roten Pixel wie folgt aus:

compare -metric rmse -subimage-search -dissimilarity-threshold 1 image.png \(-size 1x1 xc:red \) null: 

0 (0) @ 317,121 

Hinweise:

Ich benutzte nur die Summe der Quadrate eher als die Quadratwurzel der Summe der Quadrate, weil es rechnerisch schneller ist und die Ergebnisse die gleichen sind, weil es gilt, dass, wenn a> b, dann a * a> b * b in diesem Fall.

Ich verwendete etwas andere rx und ry von denen durch die Sub-Bild-Suche erzeugt, weil OP sagt, er hatte die Koordinaten und die durch Sub-Bildsuche gefunden finden nicht das genaue Zentrum des ziemlich großen roten Flecks, aber stattdessen die obere linke Ecke des roten Flecks.

Verwandte Themen