Bild um einen Kreis wickeln

8

In diesem Beispiel versuche ich, ein Bild wie unten beschrieben um einen Kreis zu legen.

Um das Bild zu umbrechen, berechnete ich einfach die x, y Koordinaten mit trig. Das Problem ist, dass die berechneten X- und Y-Positionen gerundet werden, um sie zu Ganzzahlen zu machen. Dies bewirkt, dass die leeren Pixel das umhüllte Bild oben sehen. Die x, y-Positionen müssen eine Ganzzahl sein, da sie Positionen in Listen sind.

Ich habe das im folgenden Code noch einmal gemacht, aber ohne Bilder, um die Dinge einfacher zu sehen. Alles, was ich getan habe, ist, zwei Arrays mit binären Werten zu erstellen, ein Array ist schwarz, das andere weiß, dann wird das eine auf das andere gelegt.

Die Ausgabe des Codes ist.

%Vor%

Ich habe später über den Midpoint Circle Algorithmus herausgefunden, aber ich hatte damit ein schlechteres Ergebnis.

%Vor%

Kann jemand vorschlagen, die leeren Pixel zu entfernen?

    
jackjameshoward 03.08.2016, 13:27
quelle

2 Antworten

4

Sie haben Probleme, Ihren Kreis aufzufüllen, weil Sie sich dem falsch nähern - ganz wörtlich.

Beim Zuordnen von von zu einem Ziel to müssen Sie Ihr Ziel ausfüllen und jedes übersetzte Pixel davon in das < em> Quelle Bild. Dann gibt es überhaupt keine Chance, dass du ein Pixel vermisst, und ebenso wirst du niemals mehr als ein Pixel zeichnen (oder nachsehen).

Das Folgende ist ein bisschen grob und fertig, es dient nur als ein Beispiel für ein Konzept. Ich schrieb zuerst einen Code, um einen gefüllten Kreis von oben nach unten zu zeichnen. Dann habe ich etwas mehr Code hinzugefügt, um den mittleren Teil zu entfernen (und eine Variable Ri für "inneren Radius" hinzugefügt). Dies führt zu einem festen Ring, bei dem alle Pixel nur einmal gezeichnet werden: von oben nach unten, von links nach rechts.

Wie Sie den Ring genau zeichnen, ist eigentlich nicht wichtig! Ich habe zuerst Triggerung verwendet, weil ich daran gedacht hatte, das Winkel-Bit wieder zu verwenden, aber es kann auch mit Pythagorus und sogar mit Bresenhams Kreis-Routine gemacht werden. Alles, was Sie beachten müssen, ist, dass Sie über die Ziel Zeilen und Spalten iterieren, nicht die Quelle . Dies liefert die tatsächlichen Koordinaten x , y , die Sie in die Neuzuordnungsprozedur einspeisen können.

Mit den oben genannten und funktionierenden, schrieb ich die trigonometrischen Funktionen, um von die Koordinaten zu übersetzen, die ich einem Pixel bei in das Originalbild geben würde. Dazu habe ich ein Testbild mit Text erstellt:

und eine gute Sache, die auch war, als ich im ersten Versuch den Text zweimal (einmal links, einmal rechts) und gespiegelt bekam - das brauchte ein paar kleinere Verbesserungen. Beachten Sie auch das Hintergrundraster. Ich fügte hinzu, dass um zu überprüfen, ob die "oberen" und "unteren" Linien - die äußersten und innersten Kreise - richtig gezeichnet wurden.

Wenn ich meinen Code mit diesem Bild und Ro , Ri bei 100 und 50 ausführe, bekomme ich folgendes Ergebnis:

Sie können sehen, dass die Auslösefunktionen am äußersten rechten Punkt beginnen, sich im Uhrzeigersinn bewegen und das obere Ende des Bildes nach außen zeigen. Alles kann trivial eingestellt werden, aber auf diese Weise imitiert es die Ausrichtung, die Sie Ihr Bild gezeichnet haben möchten.

Dies ist das Ergebnis mit Ihrem Iris-Bild, wobei 33 für den inneren Radius verwendet wird:

und hier ist eine nette Animation, die die Stabilität des Mappings zeigt:

Schließlich ist mein Code dann:

%Vor%

Die auskommentierten Zeilen zeichnen einen durchgehenden weißen Ring. Beachten Sie die verschiedenen Verbesserungen hier und da, um das beste Ergebnis zu erzielen. Zum Beispiel wird distance von der Mitte des Rings aus gemessen und liefert daher einen niedrigen Wert für nahe der Mitte und die größten Werte für die Außenseite des Kreises. Wenn Sie das direkt auf das Zielbild zurückstellen würden, würde der Text mit seinem oberen "nach innen" zeigen und auf das innere Loch zeigen. Also habe ich dieses Mapping mit height - distance - 1 invertiert, wobei -1 es wieder von 0 auf height mappt.

Ein ähnlicher Fix ist in der Berechnung von distance selbst; Ohne die Tweaks Ri+1 und height-1 würde entweder die innerste oder die äußerste Zeile nicht gezeichnet werden, was darauf hinweist, dass die Berechnung nur um ein Pixel entfernt ist (was genau der Zweck dieses Rasters war).

    
usr2564301 07.08.2016, 23:13
quelle
4

Ich denke, was Sie brauchen, ist ein Rauschfilter. Es gibt viele Implementierungen, von denen ich glaube, dass ein Gauß-Filter ein gutes Ergebnis liefert. Hier finden Sie eine Filterliste . Wenn es zu sehr verschwimmt:

  • Behalte dein erstes berechnetes Bild
  • berechnet gefiltertes Bild
  • kopiert fixierte Pixel vom gefilterten Bild zum ersten berechneten Bild

Hier ist ein grober durchschnittlicher Filter, der von Hand geschrieben wurde:

%Vor%

und das Ergebnis:

Bei diesem Vorgang wird im Grunde zwischen zwei Bereichen gescannt, um nach fehlenden Pixeln zu suchen und sie durch durchschnittlich 4 benachbarte Pixel zu ersetzen. In diesem schwarzweißen Fall ist alles weiß.

Ich hoffe, es hilft!

    
Fma 03.08.2016 13:35
quelle