Hab mir den verlinkten Thread nicht durchgelesen, mir ist aber noch folgender Algorithmus eingefallen:
Annahme:
Dein Bild besteht nur aus den Farben schwarz und weiß (falls es außerhalb des schwarzen Kreises noch andere Farben gibt, brauchst du noch einen zusätzlichen Zustand) und du weißt, dass innerhalb des schwarzen Kreises nur ein weißer Kreis sein kann und sonst nichts.
Dein Foto müsste vorher also am besten mit einem schwarz/weiß-Filter bearbeitet werden oder weiß und schwarz eben als Bandbreite definiert werden.
Vorgehen:
Du hast eine leere Liste (LinkedList benutzen)
Du gehst alle Pixel des Bildes durch (am besten zeilenweise) und prüfst jedes Pixel auf seine Farbe:
Am Anfang bist du im Zustand "schwarz".
Ist das Pixel schwarz gehst du einfach ein Pixel weiter.
Ist das Pixel weiß, speicherst du seine Koordinaten in der Liste, setzt deinen Zustand auf "weiß" und gehst ein Pixel weiter.
Ist jetzt ein Pixel weiß, gehst du einfach ein Pixel weiter.
Ist das Pixel schwarz, speicherst du die Koordinanten des vorherigen Pixels in der Liste, setzt den Zustand auf "schwarz" und fängst in der nächsten Zeile von vorne an.
Ist das Bild abgearbeitet, hast du in der Liste die Koordinaten aller Randpixel des weißen Kreises.
Jetzt bildest du das arithmetische Mittel aller x und y Koordinaten und hast so deinen Mittelpunkt des Kreises. Durch die Berechnung der Entfernung zwischen diesem Mittelpunkt und einem beliebigen Randpunkt aus der Liste erhälst du einen Radius. Damit ist dein Kreis beschrieben.
Erläuterungen:
In jeder Zeile gibt es ein oder zwei Randpixel des weißen Kreises, deshalb kannst du nach dem zweiten Zustandwechsel mit der nächsten Zeile weitermachen. Gibt es in einer Zeile nur einen weißen Pixel, kannst du diese Pixel trotzdem doppelt speichern; am Ergebnis sollte sich eigentlich nichts ändern und das Prüfen, ob der Pixel schon in der Liste ist, kostet zu viel Zeit.
Die Ergebnisse sind eventuell nicht ganz exakt, da du Integer-Arithmetik verwendest (da Pixelkoordinaten eben diskret sind).
Das ganze lässt sich aber zur Beschleunigung wohl auch gut Parallelisieren:
Dafür kannst du z. B. sagen, dass jeder Thread eine Zeile bearbeitet. Du machst ein Array mit 2*Thread-Anzahl einträgen (jeder Thread findet zwei weiße Pixel). Jeder Thread schreibt nur an seine eigenen Array-Positionen (z. B. 2*ThreadID und 2*ThreadID+1), damit keine Locks nötig sind.