Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Im Rahmen einer Belegarbeit soll ich ein Algorythmus entwickeln, der die Anzahl der Pixel einer jeweiligen Fläche zählt.
Dabei ist das bild ziemlich verrauscht und es soll zwar nicht grob geschätzt sein aber auch nicht 100% korrekt.
Meine momentane Idee sieht wie folgt aus.
1.erstelle das bild nochmal(bild3) und erstelle ein leeres bild(bild2)
2.errechne aus den ersten 3x3 pixel(aus bild1) ein mittelwert(erster pixel ist der erste nicht in bild 3 schwarze pixel)
3.gehe auf x achse nach rechts(wenn x=width,dann y++ und x=0)
4.prüfe ob pixel auf 3. bild schwarz ist, wenn ja dann schritt 3
5a.ist wert<mittelwert+tolleranz und wert>mittelwert-tolleranz, dann fläche[n].count++ und pixel im 3. bild schwarz färben
5b.wenn nicht im tolleranzbereich, dann x=0 und y++(wenn y=height dann Schritt6)
6.gehe bild3 punkt für punkt durch und überall wo ein schwarzer punkt ist und ein schwarzer punkt in bild2, dann setze in bild2 den ermittelten grauwert
7.wenn anzahl der gezählten pixel<>bildanzahl ist dann Schritt2
Wie würdet ihr ran gehen ?
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Um das Rauschen wegzukriegen:
Ein paar mal Erosion:
Du hast eine 3x3-Matrix, die Mitte ist dein "Hotspot". Dieser Hotspot über alle Pixel des Quellbildes bewegen (Also x, y und die Channel) und in's Zielbild das jeweilige Minimum der 9 Matrixpixel schreiben.
Dann ein paar mal Dilatation:
Das selbe, bloß das Maximum der Pixel nehmen.
Prima funktioniert bei sowas auch fourier-transformation und abschneiden hoher frequenzen bzw. wavelet trafos und selbiges. das entrauscht ganz massiv - im wesentlichen macht man dabei aber nur einen tiefpassfilter, wenn du also eine geschickte faltung verwendest (diskrete wavelet-trafos sind faltungen), wirst Du zumindest schonmal das rauschen los -- sprich genau das, was alibi empfohlen hat, mit dem vorteil, daß Du es auf diese weise theoretisch viel leichter begründen kannst.
wenn das bild mal entrauscht ist, erstellst Du ein histogramm und fischt dir cluster heraus - ab dem zeitpunkt hast Du ne ahnung über die verteilung der farben und deren pixel-häufigkeit - wenn flächen immer unterschiedliche farben haben, wie in deinem bild, bist du damit bereits fein raus. wenn du auch noch verschiedene flächen mit gleicher farbe unterscheiden musst, wirds schwieriger.
erst falten wie bereits von den Vorpostern beschrieben, dann eine Zauberstab implementierung drüberlaufen lassen. Wie genau die funktionieren soll hängt von deinen genauen anforderungen ab. Du kannst den farbunterschied entweder auf einen willkürlichen Anfangspunkt innerhalb der Fläche, auf den Durchschnitt der bereits verarbeiteten Pixel, oder auf bereits verarbeitete Nachbarn beziehen.
Rauschen kann man grundsätzlich nicht entfernen ohne auch informationen zu vernichten. In diesem Fall ist der tiefpass wohl eher das geringer übel. eine 3x3 konvolution matrix (alle werte = 1/9 ) sollte es tun.
Farben zuordnen:
Die beste Möglichkeit wäre ein Histogramm zu erstellen, dieses anschließen mit einem tiefpass zu glätten. Die Maximalwerte sind die Farben, die Minimalwerte die Stellen , an denen die Farben von einander getrennt werden.
Der Zauberstab ist für die aufgabe nur wenig brauchbar, da man wahrscheinlicher weise eine falsche Tolleranz wählt, und auch das ergebnis vonm gewähltem startpunk aus abhängt
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.