Restlichtverstärker - Nachtsichtgerät



  • Ich koennte mir vorstellen, dass ein Hochpassfilter bei Dunkelheit noch etwas mehr sichtbares aus dem Bild herausholt. Aber Nachtsicht ist das nicht.



  • Was ist ein Hochpassfilter? Muss dazu gleich nochmal ne Runde googlen.
    Meine Theorie war die Folgende:

    Nur, weil der menschliche Betrachter etwas nicht sieht, heißt dass nicht das es gar nicht im Bild vorhanden ist.

    Beispiel:
    RGB(2,2,2)
    RGB(1,0,1)

    Hier sind Farben vorhanden, die allerdings so dunkel sind, dass man sie nicht vom schwarzen Farbton unterscheiden kann.
    Der Rechner könnte diese Farbwerte allerdings so hoch setzen, dass man sie sehn kann.

    Wie funktioniert denn sonst der Nachtmodus von HandyCams? Da ist ja auch keine "Hardware" wie bei so'nem militärischen Restlichtverstärker drin.

    Aber schonmal Danke
    Romeo



  • Im Grunde funktioniert das schon so wie von Dir ausgedacht, d.h. üblicherweise (nehmen wir mal nur ein Graubild an) kommen alle Werte von 0 bis 255 vor. Ist das Bild nun sehr dunkel, wird es z.B. keine Farbwerte größer 64 geben.

    Nun spreizt die Kamera die Farbwerte, d.h. alle Farbwerte zwischen 0..63 werden auf das Intervall 0..255 hochskaliert - damit werden die von Dir angesprochenen schwachen Unterschiede dann deutlicher sichtbar gemacht.

    Aber der Einwand "was nicht ist kann man auch nicht einfärben" gilt natürlich weiterhin. Du kannst nur schwache Helligkeitsunterschiede stärker voneinander trennen.



  • Hier kommt mal ein Algorithmus, der für dich interessant sein sollte:

    Histogram equalization:

    1. For an N x M image of G gray-levels (often 256), create an array H of length G initialized with 0 values.

    2. Form the image histogram:

    Scan every pixel an increment the relevant member of H - if pixel p has intensity gp perform:

    H[gp] = H[gp] + 1
    

    3. Form the cumulative image histogram Hc:

    Hc[0] = H[0]
    Hc[p] = Hc[p-1] + H[p]        p = 1,2,...,G-1
    

    4. Set

    T[p] = round(Hc[p] * (G-1) / (NM))
    

    5. Rescan the image and write an output image with gray-levels gq, setting

    gq = T[gp]
    


  • PS: Wenn du den Algorithmus implementierst, dann empfehle ich dir, am Anfang tatsächlich auf Grauwertbilder zu arbeiten, also auf Bildern, bei denen

    R = G = B

    gilt. Ansonsten wird der Algorithmus die R, G und B Werte unterschiedlich verändern, was zu einem nicht erwünschten Ergebnis führt.



  • ähm..bei handycams ist es doch nicht reine software-sache, oder? ich habe keine handycam, noch nie eine benutzt, aber ich emine, dass sie nicht nur restlicht verstärkt. (http://www.eduspace.eurisy.org/eduspace/subdocument/default.asp?document=353&language=de)

    bei vielen kameras is vorne (bis jetzt lediglich aus der ferne gesehen) sone kleine matte leuchte dran, habs noch nie lichtsenden gesehen. infrarot? sry, bin laie



  • afaik können ccd chips infrarot empfangen. normalerweise wird das weggefiltert, aber bei der night shot funktion nützt man das aus. hab auch wo n tut aufgegriffen um kameras so zu modden, das sie ir regulär empfangen. damit soll man angeblich durch kleidung schaun können. grade darum isses auch ausgeschalten.



  • Also, ob IR-Licht empfangen werden kann lässt sich ja schon relativ einfach sehn, wenn man eine Fernbedienung vor die Cam hält und drauf rumspielt.

    Das man dabei durch Kleidung sehn kann, würde ich aber eher dem Wunschdenken mancher Leute zuordnen, als der Realität.

    ----------

    Aber nun wieder zum Thema!
    Dank eurer Hilfestellung konnte ich das Programm jetzt fertig machen und Screenshots in verschiedenen Situationen könnt ihr hier sehen.

    Das Programm ist jetzt so aufgebaut, dass es drei Modi gibt.
    1. Normal Grayscale Modus
    2. Automatik Restlichtverstärkung
    3. Restlichtverstärker mit dem Mathematisch nicht realistischen
    Multiplikationsfaktor 10.

    ----------

    Wie man sieht, liegen die Ergbenisse zwischen unseren Überlegungen.
    Man sieht zwar deutlich mehr, als ohne ABER in "absoluter" Dunkelheit sind auch keine Wunder zu erwarten => man sieht nichts!

    P.S.:
    Eine Überlegung wäre es mal nen Infrarot-Scheinwerfer aus mehreren Infrarot LEDs zu basteln.

    Bin mal gespannt wie die Ergebnisse dann aussehn.

    Danke für eure Hilfe
    Romeo



  • Romeo schrieb:

    Also, ob IR-Licht empfangen werden kann lässt sich ja schon relativ einfach sehn, wenn man eine Fernbedienung vor die Cam hält und drauf rumspielt.

    Ich hab ja gesagt, das IR normalerweise Rausgefiltert wird.

    Romeo schrieb:

    Das man dabei durch Kleidung sehn kann, würde ich aber eher dem Wunschdenken mancher Leute zuordnen, als der Realität.

    Click



  • @Romeo: Implementier doch mal den Algorithmus, den ich weiter oben gezeigt habe. Mich würde schon interessieren, wie das Ergebnis des Algorithmus im Vergleich zu den anderen Varianten aussieht. Bei dem Algorithmus, den ich gezeigt habe, sollte eigentlich ein sehr gutes Ergebnis herauskommen. ...der lohnt sich also.



  • @ Gregor _

    Ich würde deinen Quellcode ja gerne realisieren nur leider habe ich seine Funktionsweise noch nicht wirklich durchschaut.

    Beschreib mir doch mal was er bewirken soll und bzw. oder gib mir doch mal die Quelle aus der du ihn hast.

    Danke und
    MFG

    Romeo



  • Das ist ein Algorithmus, der die vorhandenen Pixelintensitäten (bzw. Grauwerte) über den gesamten, zur Verfügung stehenden Bereich an Intensitäten gleichverteilt.

    Wenn du also ein sehr dunkles Bild hat, dann werden die Pixel, die nicht ganz so dunkel wie der Rest sind, stark erhellt. Wenn du nur Grauwerte in der Mtte hast, dann werden die etwas dunkleren dieser Grauwerte weiter verdunkelt, die etwas helleren werden noch heller. Wenn du ein sehr helles Bild hast, dann werden die Pixel, die nicht ganz so hell wie der Rest sind, dunkler gemacht. Wenn du helle und dunkle Pixel hast, aber keine in der Mitte, dann werden durch diesen Algorithmus einige die hellen und die dunklen Bereiche praktisch "in die Mitte gestreckt", wodurch man am Schluss auch Pixel mit mittlerer Intensität hat.

    Der Algorithmus ist aus "Image Processing, Analysis, and Machine Vision" von Milan Sonka, Vaclav Hlavac und Roger Boyle.



  • Achso,

    es werden also nicht wie bei mir alle pixel über den gleichen Faktor erhellt sondern um den Mittelwert werden die Pixel gestreckt.

    Jetzt habe ich nur noch nicht deinen Algorithmus verstanden.

    Also soweit ich das verstanden habe (1.Zeile deiner BEschreibung =), soll man ein Array H erstellen, dass so "groß" ist wie, es Farben im Bild gibt
    (bei 256 Farben - 256 Elemente im Array)

    Dann geht man das ganze Bild durch und trägt die Anzahl der jerweils erkannten Farben in dem Array ein, damit man am Ende ne Art Statistik hat.

    Beispiel:
    Grauwert || Häufigkeit
    2 2
    15 0
    72 165
    96 99
    122 22
    255 45

    Wie es dann aber weiter geht konnte ich aus dem Quellcode noch nicht so ganz ersehn, also beschreib doch mal wie es weiter gehen soll.

    Romeo



  • es werden also nicht wie bei mir alle pixel über den gleichen Faktor erhellt sondern um den Mittelwert werden die Pixel gestreckt.

    Naja, eigentlich ist es noch etwas anders. Es gibt hier keinen festen Faktor, um den etwas gestreckt wird. Wenn du annimmst, dass es einen Faktor gibt, dann ist der für jede Pixelintensität anders.

    Ok, Schritt 1 und 2 hast du schon zusammengefaßt.

    In Schritt 3 wird noch ein Array mit der gleichen Größe, wie das Array, was man in (2) ereugt hat, erzeugt. Man setzt das 0. Element dieses neuen Arrays gleich dem 0. Element des in 2 erzeugten Arrays. Dann geht man die Elemente in aufsteigender Reihenfolge durch und setzt jeweils n-te Element des neuen Arrays auf den Wert, der sich aus Summe des (n-1)-ten Elementes des neuen Arrays und des n-ten Elemetes des alten Arrays ergibt. Man form in diesem Schritt also ein "kumulatives Histogramm". Das ist ein Array, bei dem für jeden Intensitätswert angegeben ist, wieviele Pixel in dem Bild diese oder eine geringer Intensität haben.

    In Schritt 4 erzeugst du noch ein Array mit der gleichen Größe, wie die Arrays aus (2) und (3). Die Werte für dieses Array setzt du so, wie es die Formel angibt, die da steht. In der Formel ist G die Anzahl der Grauwerte, also hier 256, (G-1) ist also der maximale Grauwert. N*M ist die Anzahl der Pixel. In diesem Schritt machst du also vom Sinn her folgendes: Da du eine Gleichverteilung der Grauwerte haben möchtest, schaust du für jede Pixelintensität nach, in welche Intensität sie umgewandelt werden muss, damit in etwa eine Gleichverteilung vorliegt. In dem resultierenden Array sind dann also für alle 256 Grauwerte die Grauwerte abgelegt, auf die sie in dem fertigen Bild abgebildet werden sollten.

    Im 5. Schritt gehst du jetzt das alte Bild nochmal durch und setzt auf das neu zu erzeugende Bild jeweils die Grauwerte, die der entsprechenden Pixelintensität im alten Bild (für jedes Pixel) durch das Array aus (4) zugewiesen wurde.


Anmelden zum Antworten