WERBUNG

Vignettierung entfernen

Knix mit icks

Themenersteller
Guten Tag,

ich habe eine Frage bezüglich dem Entfernen der Vignettierung in einem live Bild. Was ich genau mit live Bild meine ist folgendes:

Ich habe für meine Kamera (Raspberry Pi Kamera) einen automatischen Weißabgleich selbst geschrieben. Je nach Helligkeit (meistens abhängig von der Tageszeit und Sonneneinstrahlung) wird hier die Blau und Rot Werte aus dem RGB Bereich so angepasst, dass ein ausgewogenes Verhältnis zwischen allen drei Farben entsteht.

Das klappt soweit prima, funktioniert sogar noch viel besser, wenn ich statt RGB die YUV Werte für den Weißabgleich nehme. Die YUV Werte konvertiere ich natürlich vorher in RGB.

Leider hab ich momentan Schwierigkeiten die Vignettierung von der Kamera zu kalibrieren, oder wie auch immer man das nennt:lol:

Das Problem der ist hier ja eigentlich, dass der Y Wert, welcher den Helligkeitsgrad der Farbe bestimmt nicht über das ganze Bild hin gleich ist. (so meine Vermutung, bitte korrigiert mich, wenn ich da falsch liegen sollte)

Ich habe mal gelesen, dass man die Vignettierung demensprechend entfernen kann, indem man ein weißes Blatt Papier fotografiert und dieses invertiert, so würde man die Vignettierung der Kamera sehen.
In Photoshop kann man diesen nun ganz leicht entfernen, indem man auf dem invertieren Bild das Original Bild (möglichst beide gleich groß) legt und da bestimmte Einstellungen vornimmt.

Nun meine Frage, welche genauen Einstellungen sind dies? Wie kann ich diese Einstellungen auch ohne Photoshop ausführen? Ich würde gerne wissen, was da im Hintergrund passiert, da ich dementsprechend mein Python Script anpassen möchte.

Indem ich den Y-Wert aus dem YUV Bild auf einen Wert setzte (also quasi den Mittelwert aus allen Y-Werten eines Bildes bilde) ist die Vignettierung immer noch zu sehen, also denke ich, dass ich da ein grundlegendes Verständnisproblem diesgebzüglich hab.

Vielen Dank für eure Geduld und hoffe bald auf hilfreiche Antworten :)

LG Knix mit icks
 
Zuletzt bearbeitet:
Zu deinem Ps gehört auch Camera RAW - daring gibts die Objektivkorrektur welche das entsprechene
Objektivprofiel anwendet. In diesem ist auch die Vignetierung des Objektives hinterlegt.
Das ganze funktioniert natürlich nur am RAW.
Wenn du ne Graukarte aufnimst und die Helligkeit so einstellst das sich in Bildmitte ein Neutralgrau
ergibt und das dann invertierst kannst du das als Ebene im Modus ineinangerkopieren auch
manuell basteln. Natürlich müsste die Graukarte schon sehr gleichmäßig beleutet werden.
 
Ich weis jetzt nicht genau wad Du gemacht hast.
Ich würde eine Einheitliche weiße Fläche mit dem Pi aufnehmen. Die Helligkeit des Mittelpunktes durch jeden Punktes dividieren. Und bei jedem Bild dann jeden Punkt mit dem Faktor verrechnen.
 
Also nehme ich bei einem 1920 x 1200 Bild den Pixel an 1152000 Stelle (1920x1200/2) davon den Y-Wert (im YUV Format) und teile diesen durch alle anderen Y-Werte und nehme dann diesen Faktor welcher bei dem Weißen Bild entsteht und verrechne diesen dann bei den anderen Bildern jeweils mit dem Y-Wert?

Hab ich das so richtig verstaden?:confused:
 
Was sollen denn "alle anderen Y-Werte" sein?
Wenn du den insgesamt hellsten Punkt einer weißen Testaufnahmen nimmst und seinen Y-Wert durch jeweils den Y-Wert jedes einzelnen Punktes teilst, hast du den Helligkeitsfaktor für den jeweiligen Punkt.

Das ist nicht ein Faktor, sondern ein Faktor pro Punkt.

Wenn du dann dieses Ausgleichsmuster nimmst und den Y-Wert jedes einzelnen Punktes mit dem Y-Wert einer beliebigen Aufnahme multiplizierst, sollte das Ergebnis passen.

Zum Vergleich kannst du ja dein weißes Testbild nehmen und prüfen, ob das Ergebnis gleichmäßig weiß ist.
 
Irgendwie klappt das bei mir nicht :-(

Ich bin jetzt einige Tage dabei das in Python zu realisieren für meinen Pi.

Mein kleines Python Programm soll vor der Aufnahme eines Bildes einen automatischen Weißabgleich machen und währendessen die Vignettierung entfernen.

Die Vorgehensweise ist wie folgt:
1) Einstellen der Parameter für meinen Quellcode:

#Konvertierungsarray von YUV nach RGB
C = np.array([[1.164, 0.000, 1.596],
[1.164,-0.392,-0.813],
[1.164, 2.017, 0.000]])
# Kameraauflösung
width = 1920
height = 1200
# Anzahl der Korrekturabgleiche
attempts = 300
# Startverhältniss zwischen blau und rot
red = 0.965
blue = 1.350

Aus einem YUV Stream (also nach jeder Änderung des Wertes "red" oder "blue" wird ein neuer Stream aufgenommen) lese ich die RGB Werte mit dem Konvertierungsarray aus. Jedoch habe ich zuvor von einem "GrauBild" eine ähnliche Datei wie dem des Streams importiert, um hier eine Maske zu bekommen, sodass die Vignette entfernt wird.

Also wird vor jedem Abgleich der Y-Wert mit einem Faktor-Array Multipliziert und erst dann wird das Konvertierungsarray ausgeführt.
-----------------------------------------------------------------------
Code:

factor = Helligkeit(data)
Y = Y_Wert(factor, stream)
U = U_Wert(stream)
V = V_Wert(stream)
YUV = YUV_Array(Y,U,V)
RGB = YUV_nach_RGB(YUV)

def Y_Wert(factor, stream):
Y = np.fromfile(stream, dtype=np.uint8, count=fwidth*fheight).\
reshape((fheight, fwidth)).astype(float)
Y = Y*factor
return Y

def Helligkeit(data):
hellster_wert = 0.0
Y = np.fromfile(data, dtype=np.uint8, count=fwidth*fheight).\
reshape((fheight, fwidth)).astype(float)
for i in range(fheight):
for j in range(fwidth):
if(hellster_wert < Y[j]):
hellster_wert = Y[j]
factor = Y/hellster_wert
return factor
-----------------------------------------------------------------------
Die anderen DEF hab ich mal nicht mit gepostet, wird sonst zu viel des Guten^^

Das Ergebnisbild sieht immer so aus, dass es mittig dunkler ist als außen.

Hat wer Ideen, wie ich das hinbekommen könnte? Bin momentan echt am verzweifeln :(:confused:
 
Hier ein Beispielbild dazu:

Man sieht in der Mitte des Bildes noch den starken Helligkeitsabfall.
 

Anhänge

Zuletzt bearbeitet:
Ich halte das Bild für ungeeignet. Wie schaut denn das Bild zum Kalibrieren aus?
Wenn die Vorlage nicht optimal, gleich hell ist hast Du ein Probem.
 
das schaut interessant aus. Eine vignetierung ist typischerweise eine abschattung.
Ist es sicher das die Fläche nicht von links mehr beleuchtet wurde?

Wenn du die Maske auf dieses Bild anwendest kommg ein einheitlichrs heraus?
 
So, nach ein bisschen basteln hab ich nun ein einigermaßen einheitliches Graubild bekommen. Doch iwie hat das noch einen grünstich... ist das normal?
 

Anhänge

@ASretouch: Offensichtlich nicht in diesem Falle.

@Knix: Wie es aussieht, betrifft die Vignettierung nicht nur Helligkeit, sondern auch die Farbe. Ich kenne es von schlechten Handykameras, dass sie gerne mal einen magentafarbenen "Hotspot" in der Mitte erhalten. Wahrscheinlich ist das dann auch noch stark von der eingestellten Iso abhängig. Du bräuchtest dann für jede Iso eines deiner Testbilder, wobei du es dann bestenfalls Pixel für Pixel miteinander verrechnest.
 
Die Idee ist realisiert, das Ergebnis immer noch ungenügend :(

Die Bilder wurden in einer Black-Box aufgenommen, die durch LED Licht dafür sorgt, dass das Papier gleichmäßig beleuchtet wird. Also komplett unabhängig von der Tageszeit!

Das Bild Alpha.jpg ist das aufgenommene Bild, ohne jekliche Manipulation und manuellen Einstellparameter (alles sozusagen auf Auto gelassen)

Das Bild Alpha_AWB.jpg ist das original Bild durch einen von mir programmierten Weißabgleich geändert (nur eine minimale veränderung des Bildes)

Das Bild Alpha_Vign.jpg ist das Vignettierungsscript auf das original Bild angewendet. Hier sieht man in der Mitte des Bildes noch andere Farben, als das eigendliche Weiß. Auch zum Rand hin, erkennt man unregelmäßigkeiten.

Das Bild Alpha_AWB_Vign.jpg ist mit beiden "Verbesserungen", also Weißabgleich und Entvignettierung. Hier erkennt man in der Mitte einen leichten Blaustich und zum Rand hin einen Rotstich.

Nun meine Frage: Liegt es am Objektiv, dass ich es nicht schaffe ein einheitlich Weißes Bild zu bekommen, oder ist mein Script falsch?

Kurz zu meinem Script der Entvignettierung: Ich suche mir den hellsten Punkt in dem Bild und Teile jeden anderen mit diesem Punkt. (also: HellsterPunkt/Jeden anderen)
Nun erhalte ich eine Maske, die ich dann mit dem unter gleichen Bedingungen aufgenommenen Bild multipliziere.
Wenn ich das selbe Bild jeweils nehme, hätte doch eigendlich ein einheitliches Bild als Resultat herauskommen müssen? Oder verstehe ich das was falsch?

Vielen Dank für eure Antworten.

LG Knix
 

Anhänge

Ist vielleicht die LED Beleuchtung das Problem?
Wie sieht das Spektrum der "weissen" LED aus?

Nur weil unser Hirn weiss macht, muß es ja nicht weiss sein... :D

Thomas
 
Wie sieht denn die Graukarte in der Blackbox mit einer richtigen Kamera fotografiert aus? (also mit einem Objektiv, dessen Vignetierung bekannt ist)
 
Zuletzt bearbeitet:
Also wenn du eh rechnen musst kannst ja zur Überprüfung Deine Berechnung die Abweichungen verstärken.
Nachdem die Vorlage ja grau ist sollten alle Punkte nach der Berechnung für R, G und B den gleichen Wert haben.

Kontrollrechnung für Weissabgleich:
(1-(R/((R+G+B)/3))*10)+1

Dadurch wird die Farbabweichung jedes Punktes verzehnfacht

Bei der Helligkeit kannst Du es genauso machen.
Nur ist die Korrekturbasis die Durchschnittliche Helligkeit.
 
Ist vielleicht die LED Beleuchtung das Problem?
Wie sieht das Spektrum der "weissen" LED aus?

Nur weil unser Hirn weiss macht, muß es ja nicht weiss sein... :D

Ja, das Hirn ist doof, macht den Abgleich einfach selbst :D

Wie sieht denn die Graukarte in der Blackbox mit einer richtigen Kamera fotografiert aus? (also mit einem Objektiv, dessen Vignetierung bekannt ist)

Ich habe zum Testen erst mal nur ein weißes Blatt Papier genommen. Das ist nicht ganz ideal, aber eine 18%ige Graukarte hab ich leider momentan nicht zur Hand.

Vom Prinzip her sollte es ja eigendlich egal sein, wenn ich das Bild, womit ich die Entvignettierung machen möchte auch nehme und darauf die Entvignettierung durchführe. Mein Ziel war es erst mal ein einheitliches Bild zu bekommen. Ob es einheitlich weiß ist oder etwas gräulich, ist völlig egal. Es sollte nur einheitlich sein.

Was mich auf jeden Fall schon mal sehr viel weiter gebracht hat ist, man sollte immer wieder darauf achten, dass auch der Bildschirm kalibriert ist :lol:
 
WERBUNG
Zurück
Oben Unten