> I stedet for at teste hver pixel i dit bitmap kunne du måske implementere
en
> form for kant-detektion på billedet først. Denne detektion vil resultere i
> en liste med punkter, nemlig de punkter der ligger i kanten af en figur på
> den oprindelige bitmap. Hvordan denne præcist implementeres ved jeg ikke,
> men jeg ved det kan lade sig gøre.
Ja, det kan det. Jeg citerer lige fra oprindelige indlæg "Nu gør jeg det at
jeg beregner kanter i mit billede. Jeg beregner det som et
binært bitmap over kantpixels.", så jeg er da enig
Det er også nødvendigt hvis man søger cirklerne som cirkelbuerne og ikke som
udfyldte flader.
> Du vil for den liste af punkter kunne opstille alle grafer og finde
> skæringspunkterne. Disse skæringspunkter kan du evt. plotte ind i på en ny
> bitmap og her har du så en form for hough-transformation af dit billede.
Problemet er dog at man ikke nødvendigvis søger præcise skæringer, da disse
måske slet ikke forekommer. Man søger istedet høje koncentrationer af
krydsninger i et givent område.
> Husk at der kan ligge flere punkter inden for én pixel af din bitmap - det
> kommer an på opløsningen - i så fald skal de selvfølgelig akkumeleres.
Dvs.
> hver pixel angiver antallet af punkter der ligger i pixlens interval.
Man har kun ens bitmap at arbejde med. Hvordan formen af den underlæggende
struktur er, det kan man ikke udtale sig om. Den akumulering foregik jo
oprindeligt i kameraet og gav evt. et gråtonebillede.
Jeg tror problemet i din metode er at du vil løse eksakte ligninger, hvilket
forudsætter total opløsning i det oprindelige billede. Alene kantdetektionen
kan give problemer der, da den virkelige kant som sådan kan ligge mellem to
pixels. Hvis du kun beregner præcise skæringer, så vil du misse de fleste
faktiske cirkler.
Endelig er der problemet at en pixel ikke repræsenteres ved een cirkel i
parameterrummet - den repræsenteres som sådan af uendeligt mange cirkler.
Det er nok der du glider lidt af. Hvis du definerer et parameterrum for
cx,cy,r og sætter både cx og cy til [0..511] og r til [1..100] og kun
beregner for heltal, så ender du på omkring 26 milioner cirkler. Bemærk at
hvert punkt i parameterrummet er en cirkel. Hvert punkt definerer et centrum
og en radius.
Givet en pixel i dit billede skal du altså finde samtlige cirkler (punkter)
i parameterrummet som opfylder at (x-cx)^2+(y-cy)^2-r^2=0.
Disse punkter beskriver en spids kegle fra cx=x,cy=y,r=0 og ud i rummet
langs voksende r.
Hvis du beregner det diskret, som jeg beskrev lidt tidligere, og tester for
de 26 milioner cirkler, så kan du se hvilke af punkterne i parameterrummet,
der beskriver cirkler hvor (x-cx)^2+(y-cy)^2-r^2 er tæt nok på nul til at du
kalder det et match. For hver pixel beregner du altså hvilke cirkler de
kunne ligge på. Cirkler hvor mange punkter føler sig hjemme, er nok de
virkelige cirkler.
Regner du på det ved at løse ligningerne, så er problemet at hver pixel kan
beskrives ved uendeligt mange cirkler. For hver pixel skal du altså beregne
uendeligt mange cirkler og beregne skæringenen mellem disse uendeligt mange
cirkler og hver af de uendeligt mange cirkler hver af de andre pixels har.
Jeg tror ikke din metode vil virke, men takker alligevel for dit input. Vil
også give det en tanke mere om mængden af cirkler kan beregnes sådan. Tror
det dog ikke. Bare tag to pixels i 2d-billedet. For hver pixel kan du nu
tegne vilkårligt mange cirkler som skærer din pixel. Du vil derfor ende ud
med vilkårligt mange skæringer mellem alle cirklerne som skærer hver af de
to punkter.Sagt anderledes. Givet de to pixels og et tredje 2d punkt kan jeg
komme med to cirkler som hver skærer en af de to pixels og det tredje punkt.
Altså skærer de to cirkler (i det generelle tilfælde) hinanden i det tredje
punkt. Altså kan ethvert punkt fungerer som skæringmellem to cirkler som
passer med pixels - der er skæringer i hele parameterrummet.