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
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.
Kennen Sie die Koordinaten des roten Punktes? Kennen Sie die Farben "Hintergrund" und "Linie" genau? –
ja ich kenne die Koordinaten des roten Punktes – victorhernandezzero
ich kenne die Linienfarbe – victorhernandezzero