Runder maskieren Sie ein Bild in python mit numpy arrays
Ich versuche, Kreisförmige Maske, die ein Bild in Python durch Lesen eines Codes auf web, sondern völlig verloren in der Mathematik hier:
Bekam ich eine Bild (image_data
) von type = numpy.ndarray
mit shape = (3725, 4797, 3)
total_rows, total_cols, total_layers = image_data.shape
X, Y = np.ogrid[:total_rows, :total_cols]
center_row, center_col = total_rows/2, total_cols/2
dist_from_center = (X - total_rows)**2 + (Y - total_cols)**2
radius = (total_rows/2)**2
circular_mask = (dist_from_center > radius)
Ich weiß, dass er angewendet euclidean distance
zu berechnen dist_from_center
aber ich habe nicht X - total_rows
und Y - total_cols
Teil
Welche Rolle X und Y spielen auf dem Kreis ?
- Das ist eigentlich nicht der euklidischen Distanz. Sollte die Quadratwurzel der Summe. Und ja, ich glaube, du hast Recht, sollte
center_row
undcenter_col
nichttotal...
ich denke, dieser code würde produzieren ein Viertel Kreis Maske in der Mitte oben Links, nicht in eine zentrierte kreisförmige Maske in dein Bild (Hinweis:dist_from_center
ist immer noch falsch, in diesem Fall). - ja, es bildet einen Viertelkreis Maske, konnte Sie erklären Sie bitte, wie Sie feststellen, dass & könnten Sie bitte erklären
np.ogrid
in einfacheren Worten, alle Erklärungen auf der web in Bezug aufnp.ogrid
gehen weit über meinem Kopf. - Sicher, ich war am Handy als ich sah, dass dies so nicht schreiben, eine vollständige Antwort, ich dachte, jemand anderes hätte von der Zeit, als ich nach Hause kam, aber ich denke mal nicht. Ich werde für ihn gehen.
- Vielen Dank, ich werde sein warten auf Ihre Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Algorithmus, den Sie online ging, ist teilweise falsch, zumindest für Ihre Zwecke. Wenn wir auf das folgende Bild, wir wollen es maskiert wie so:
Der einfachste Weg, um eine Maske zu erstellen, wie dies ist, wie Ihr Algorithmus geht es, aber es ist nicht in der Art präsentiert, dass Sie wollen, noch bietet es die Möglichkeit, es zu ändern, auf eine einfache Weise. Was wir tun müssen, ist, sich die Koordinaten für jedes pixel im Bild, und erhalten Sie einen true/false-Wert, ob oder nicht, die pixel innerhalb des radius. Zum Beispiel, hier ist eine vergrößerte Grafik in einem Bild zeigt der Kreis den radius und die Pixel, die waren streng innerhalb dieses radius:
Nun, um herauszufinden, welche Pixel liegen innerhalb des Kreises, brauchen wir die Indizes der einzelnen pixel im Bild. Die Funktion
np.ogrid()
gibt zwei Vektoren, die jeweils die pixel (oder Indizes): es gibt einen Spalten-Vektor für die Spalte Indizes und ein zeilenvektor für die Zeilen-Indizes:Dieses format ist nützlich für Rundfunk so dass, wenn wir Sie in bestimmten Funktionen, die es tatsächlich schaffen ein raster von alle Indizes, anstatt nur diese beiden Vektoren. Wir können daher
np.ogrid()
anzulegen (oder pixel-Koordinaten der Bild, und überprüfen Sie dann jedes pixel zu koordinieren, um zu sehen, ob es innerhalb oder außerhalb des Kreises. Um zu sagen, ob es in der Mitte, wir können einfach finden Sie den euklidischen Abstand von der Mitte zu jedem pixel-Standort, und dann wenn der Abstand kleiner als der Kreisradius, wir werden markieren, die als enthalten in die Maske, und wenn er größer ist als wir ausschließen es aus der Maske.Jetzt haben wir alles, was wir brauchen, um eine Funktion, schafft diese Maske. Außerdem fügen wir eine kleine nette Funktionen; wir senden können, in der Mitte und den radius, oder automatisch zu berechnen.
In diesem Fall
dist_from_center
ist eine matrix die gleiche Höhe und Breite angegeben ist. Es überträgt die Spalte und die Zeile, die index-Vektoren in eine matrix, wobei der Wert an jedem Standort ist die Entfernung von der Mitte. Wenn wir visualisieren diese matrix als Bild (Skalierung in den richtigen Bereich), dann wäre es ein Verlauf strahlenförmig von der Mitte, die wir angeben:Also, wenn wir es vergleichen, um
radius
, es ist identisch mit schwellenwertbestimmung dieses Gradienten Bild.Beachten Sie, dass die Letzte Maske ist eine matrix von Boolean;
True
wenn die Lage ist innerhalb des radius von dem angegebenen center,False
sonst. So können wir dann verwenden Sie diese Maske als Indikator für eine region von Pixeln, wir kümmern uns um, oder wir nehmen das Gegenteil an, dass boolean (~
imnumpy
) zum auswählen der Pixel, die außerhalb dieser region. So verwenden Sie diese Funktion, um die Farbe der Pixel außerhalb des Kreises schwarz, wie ich oben an der Spitze von diesem post, ist so einfach wie:Aber wenn wir wollten erstellen eine kreisförmige Maske an einem anderen Punkt als die Mitte, konnten wir es angeben (beachten Sie, dass die Funktion erwartet, dass die Mitte-Koordinaten in
[x,y]
um, nicht die Indizierung[row,col] = [y,x]
Reihenfolge):Welche, da wir nicht geben einen radius, würde uns die kleinsten radius, so dass sich der Kreis noch passen würde in das Bild bounds:
Oder wir lassen es berechnet den Mittelpunkt, aber verwenden Sie einen angegebenen radius:
Geben Sie uns einen zentrierten Kreis mit einem radius erweitern nicht genau auf die kleinste dimension:
Und schließlich konnten wir angeben, eine radius-und center, die wir wollten, inklusive einem radius erstreckt, die sich außerhalb des Bildes Grenzen (und das Zentrum kann auch außerhalb des Bildes Grenzen gesetzt!):
Was der Algorithmus, das Sie online gefunden hat, ist äquivalent zu der Einstellung der center zu
[0,0]
und setzen den radius aufh
: