Ich baue an einem Bildweiterleitungssystem, das Bildsignaldaten aufnehmen und speichern kann. Unter Umständen sollen einfach Bildverarbeitungsmöglichkeiten in Echtzeit geschaffen werden, wie z.B: Helligkeit, Kontrast und Gamma. Da dies eindimensionale Operationen sind, die direkt auf den Datenstrom wirken, gibt es da keine Problem meinereits, wie ich da rangehen werde. Anders sieht es aus, wenn es um Bildglättung oder Kantenschärfung geht. Da müsste zweidimensional aufs Bild geschaut werden. Nach meinem Verständnis muss ich immer sektorweise mit jeweils einem Bildareal arbeiten und das dann gedanklich weiterschieben, was gfs programmiertechnisch aufwändig sein wird, aber ich denke ich weiss, ich ich das machen müsste. Wo es jetzt aufhört ist die Interpretation der Daten: Bei einem normalen Signal habe ich einen kontinuierlichen Strom von Daten, denen ich Frequenzen zuordnen kann, um z.B. einen Tiefpass zu etablieren, um das Rauschen zu redzieren. Wie ist das im zweimdimensionalen? Über welche Fläche muss sich ein Filter erstrecken? Wo tritt hier Nyqist auf und wie designed man einen Tiefpass mit seinen Koeffizienten so, dass er alles oberhalb abschneidet, wenn man runtersampeln will? Ich stelle mir eine Art von Radius um den Zentralpunkt vor, ab dem der Abstand in einem Verhältnis zum nächsten Filterkoeffizienten steht. Aber wie ist der Zusammenhang?
Dein Problem hat eigentlich nichts mit Programmierbarer Logik, sondern viel eher mit Signalverarbeitung zu tun. Ich schlage vor, den Thread dorthin (Forum DSP) zu verschieben. Einverstanden?
Hallo, bei Bildern (2D Daten) kannst du die 2D Fourier Transformation anwenden. (siehe z.B. http://de.wikipedia.org/wiki/Diskrete_Fourier-Transformation, in der Mitte der Seite sind ein paar Beispiele). Nur mit der Interpretation der Ergebnisse wird es etwas schwieriger ;) Grüße, Florian
ersten: bleib im zeit-bereich. zweiten: für einfach Filterung reicht nen 3x3 Kernel, je nach HW kannst du aufbohren 7x7, 11x11 oder 15x15. Damit geht nen Blur ( Tiefpass ) z.B: 3 3 3 3 3 3 3 3 3 und ne Edge Enhance (Hochpass) z.B: -1 -1 -1 -1 8 -1 -1 -1 -1 brauchst im "einfachsten" Fall 9 Multiplizierer und Addier, 9 Register und 2 Zeilenpuffer Wenn du die Wert dann so legst, dass ein vielfaches einer zwei-potentz rauskommt bist zu "fertig". Cheers
Beim Streamprocessing wirst du kleinere Felder benutzen müssen, da ja deine daten zeilenwise aus der Kamera tröpfeln und du dan alle "oberen" zeilen zwischenspeichern musst. Ein FPGa hat aber nicht so viel On-Board speicher. Bei Farbkameras musst du noch davor die fehlende Farben der bayer matrix interpolieren. Einige Aspekte der Bildverarbeitung in Echtzeit behandelt das Buch: 978-3540419778. Tipps zur Bildbearbeitung am PC helfen bei der Implementierung von Echtzeit-Anwendungen nicht viel weiter. MfG,
<Dein Problem hat eigentlich nichts mit Programmierbarer Logik, sondern <viel eher mit Signalverarbeitung zu tun. Ich schlage vor, den Thread <dorthin (Forum DSP) zu verschieben. Einverstanden? Falls er das in Echtzeit mit einem FPGA implementieren soll, sollte der Thread erstmal hier bleiben. Wenn er sich dann Bild über die leistungsfähigkeit von FPGA#s und entwicklungsaufwand gemacht hat, kann er bei den DSP-Gurus bei den besten, gerade noch implementierbaren Filter nachfragen. MfG,
ähmm.. schrieb: > Damit geht nen Blur ( Tiefpass ) z.B: > 3 3 3 > 3 3 3 > 3 3 3 Sollte das nicht eher sowas sein? 1 2 1 2 4 2 1 2 1 Damit er sanft reingleitet? Wie wäre es mit sowas? 0 1 2 1 0 1 2 3 2 1 2 3 4 3 2 1 2 3 2 1 0 1 2 1 0
Was vielleicht noch dem Verständnis dienen könnte: Suche mal den Begriff "Raumfrequenzen". Man kann theoretisch jedes Bild auch wieder als (unendliche) Summe von solchen Frequenzen interpretieren und schon bist Du wieder in der gleichen Gedankenwelt wie Du es im 1D Bereich warst. Noch was praktisches: Habe in meiner Diplomarbeit (wobei das imho nichts neues ist) ua. Bayer Demosaicing und Faltung auf dem Sensorstrom gemacht. Wenn Du einen (hier) 3x3 Filterkernel hast kannst Du (wenn der Sensor das vom Timing erlaubt) folgendes machen: Du baust Dir 4 verschiedene Zeilenspeicher aus Blockram die Du mit Bildzeilen füllst. Sobald 3 voll sind machst Du darauf deine Faltung. Normalerweise reicht es hier einen Kern zu benutzen und von links nach rechts zu gehen. Parallel kommt die 4. Bildzeile rein, welche Du in den 4. Zeilenspeicher legst. Die Faltung auf den 3 Zeilen wird ein wenig Latenz haben (lesen aus Blockram und ggf. Register um die Frequenz zu erhöhen). In den meisten Fällen (Datenblatt!) sollte die aber kleiner sein als das Zeilenblanking welches nach jeder Bildzeile vom Sensor kommt - die Faltung dauert also nicht so lange wie die Ankunft einer neuen Zeile inkl. horizontal Blanking => kein Problem. Ist nun die 4. Zeile gespeichert rotierst du die Rollen (Mux + etwas Logik) Deine alte Zeile 1 nimmt nun die neuen Sensordaten auf und die bisherige Zeilen 2-4 werden ausgelesen und darauf die Faltung gemacht. Usw... Latenz ist dann ca 3 Bildzeilendauern. Vielleicht hilft das ja, Micha.
Danke schon mal für die Antworten. So ähnlich habe ich mir das schon gedacht. @Micha: Das mit den Puffern und dem Interpolieren bekomme ich schon hin. Der Hinweis mit den Raumfrequenzen ist sehr gut, habe schon was gefunden. Eine Frage: Was genau meinst Du mit Faltung? Den Bayerfilter?
Berndt E. schrieb: > Eine Frage: Was genau meinst Du mit Faltung? Mit Faltung ist allgemein die Berechung der Eingangsdaten mit dem Filter gemeint. Man könnte auch Vektorverknüpfung sagen.
Wie würde denn ein Kantenschärfer aussehen? Bei der Differenzbildung Berndt E. schrieb: > @Micha: Das mit den Puffern und dem Interpolieren bekomme ich schon hin. > Der Hinweis mit den Raumfrequenzen ist sehr gut, habe schon was > gefunden. Mit welchen Auflösungen arbeitest Du im FPGA? Reicht der interne Speicher?
Berndt E. schrieb: > Den Bayerfilter? Damit ist die RGB-Farbmatrix auf dem Sensor gemeint mittels derer aus dem Grauwertbild ein Farbbild ermittelt wird: http://de.wikipedia.org/wiki/Bayer-Sensor
Für die Bayerkonversion ist das bechriebene Glättungsfilter zu wenig. Man benötigt zumindest anscliessend eine Kantenschärfung. Intelligentere Algorithmen nutzen dazu bereits das Primärbild.
Weltbester FPGA-Pongo schrieb im Beitrag #3307061: > Man benötigt zumindest anscliessend eine Kantenschärfung. Intelligentere > Algorithmen nutzen dazu bereits das Primärbild. Beispiel?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.