Schärfe messen
-
Moin,
ich habe eine Zeilenkamera und muss zwecks Justierung die Schärfe anzeigen. Der Benutzer soll am Fokus drehen und dabei in einem wachsenden Graphen sehen, wo das Bild am schärfsten ist. Dabei fallen Werkzeuge wie der Siemensstern weg, da sich das Objekt beim Justieren nicht bewegen kann (ich habe also nur eine Zeile). Ein Linienmuster ist vermutlich eine geeignete Vorlage. Wie kann ich nun am besten die Schärfe messen? Soll ich einfach immer die Differenz von Pixel zu Pixel festhalten und daraus so eine Art Schärfe-Index basteln (Summe, Durchschnitt, was auch immer)? Oder gibt es da ganz tolle, bewährte Verfahren, die ich noch nicht kenne?
-
Frequenzspektrum (Fourier): hohe Frequenzen entsprechen scharfen Kanten.
und umgekehrt: Glättung entspricht Tiefpaß.
-
!rr!rr_. schrieb:
Frequenzspektrum (Fourier): hohe Frequenzen entsprechen scharfen Kanten.
und umgekehrt: Glättung entspricht Tiefpaß.Wobei ich mir gut vorstellen kann, daß die Summe der Quadrate der Differenzen oder sowas genausogut ist.
-
Lass Dir doch mal für ein paar Bilder die Autokorrelationsfunktion anzeigen und guck dir an, wie der Peak in der Mitte aussieht. Je breiter der ist, desto unschärfer sollte das Bild sein.
Die ACF kannst Du auch schnell per FFT berechnen. Matlab-Code:
Bild = ...; % Bild irgend woher holen ACF = fftshift(ifft2(abs(fft2(Bild)).^2)); % ACF berechnen imagesc(ACF); % ...und anzeigen
Für das Prototyping von Signalverarbeitungsalgorithmen finde ich Matlab bzw Octave sehr praktisch.
Alternativ könntest Du das Bild durch einen Hochpassfilter schicken und anschließend einen RMS-Wert berechnen. Mit Hochpass meine ich folgendes:
Bild = ...; Glatt = tiefpass(Bild); Details = Bild-Glatt; RMS = sqrt(mean(Details.^2));
oder so ähnlich. Vielelicht ist die Kombination beider Ansätze auch nicht verkehrt. Also, sich die ACF einer Hochpass-gefilterten Version des Bildes anschauen. Ja, ich glaube, die Idee ist ganz gut.
Einfach mal ein paar Sachen ausprobieren.