Automatische Erkennung von Glücksbildern für die Landschaftsfotografie

Ich habe kürzlich einen Probelauf für ein Projekt gemacht, um ein bestimmtes Klettergebiet aus verschiedenen Richtungen zu fotografieren. Ich habe zu verschiedenen Tageszeiten vom selben Ort aus Aufnahmen gemacht, verschiedene Belichtungen ausprobiert und 16 Aufnahmen für die Einstellungen gemacht, die mir am besten erschienen. Der beste Schuss aus der besten Session war dieser(Miniaturbild unten). Ich hatte ursprünglich gedacht, dass ich versuchen würde, Bilder zu stapeln, aber das Ergebnis der Stapelung der 16 Aufnahmen sah schlechter aus (weniger Details) als die beste Einzelaufnahme. Atmosphärische Turbulenzen waren durch das Objektiv deutlich sichtbar, als die heiße Nachmittagssonne auf die Westseite des Felsens traf. Obwohl ich morgens einige Aufnahmen mit indirektem Licht gemacht habe, zeigten sie aufgrund des Mangels an Schatten und Kontrast und der geringeren Lichtstärke tatsächlich weniger Details. Es gibt keinen Ort, von dem aus ich aus der Nähe die richtige Perspektive auf mein Motiv bekommen kann, also müssen alle meine Bilder mit einem 135-mm- oder 300-mm-Objektiv aus großer Entfernung aufgenommen werden.

Tahquitz-Felsen

Gibt es eine Möglichkeit, den Prozess der Suche nach den Glücksbildern aus einer Reihe von Landschaftsfotos wie diesem zu automatisieren? Da Leute, die glückliche Bilder mit astronomischer Fotografie machen, manchmal Hunderte von Aufnahmen machen, gehe ich davon aus, dass sie dies irgendwie automatisieren, aber ich weiß nicht, ob die von ihnen verwendeten Algorithmen für die Landschaftsfotografie geeignet sind. Dieses Projekt wird viel Autofahren und Wandern beinhalten, daher würde ich gerne Hunderte von Aufnahmen hintereinander machen, wenn es wahrscheinlich hilfreich wäre. Ich suche nach einer Open-Source-Lösung, die unter Linux funktioniert, vorzugsweise etwas, das ich über die Befehlszeile tun kann.

Oder würde ich wahrscheinlich bessere Ergebnisse erzielen, wenn ich eine Videotechnik verwende? Beeindruckende Ergebnisse werden hier beschrieben . Aber es scheint, als müssten Sie dazu in der Lage sein, etwa 10 Bilder pro Sekunde aufzunehmen, und ich habe nicht herausgefunden, ob meine Kamera das kann. (Ich habe eine Fuji x-e1.)

[BEARBEITEN] Nachdem ich mich ein wenig mehr im Internet umgesehen habe, glaube ich, dass ich einige Teilantworten auf meine eigene Frage habe. (1) Amateurastronomen, die Lucky Imaging verwenden, scheinen alle Windows zu verwenden und "Shareware"-Windows-Software zu verteilen. (2) ABER die astronomischen Techniken beinhalten alle die Auswahl eines "Referenzsterns", von dem angenommen wird, dass er eine Punktquelle ist. Wenn Sie einen solchen Referenzstern haben, ist es ziemlich trivial, ein Maß für die Bildqualität zu erhalten. Ein häufiges scheint das Strehl-Verhältnis zu sein, das im Grunde die Spitzenintensität des Bildes Ihres Referenzsterns ist. Wenn diese Eindrücke also stimmen, dann kann es für mich sinnvoll sein, zu versuchen, einen eigenen Bildauswahlalgorithmus für Landschaften zu entwickeln.

Möglicherweise müssen Sie genau definieren, was Sie mit "Glück" meinen ... Das ist ein ziemlich vager Begriff, der keine unmittelbare Zuordnung zu technischen Eigenschaften eines Bildes hat ... Ich vermute, was Sie sich vorstellen, wird sehr subjektiv sein.
@twalberg: Ich beziehe mich auf so etwas: en.wikipedia.org/wiki/Lucky_imaging Soweit ich weiß, ist "Lucky Imaging" der Standardbegriff. Ich gehe davon aus, dass die Algorithmen, die zum Auswählen von Glücksbildern aus großen Mengen verwendet werden, einen relativ gut definierten Begriff von "Glück" verkörpern, aber ich weiß nicht, was dieser Begriff ist oder ob er für Landschaften genauso geeignet ist wie für die Astronomie. Das ist im Wesentlichen meine Frage.
Ah ... Ich war mit dem Begriff nicht vertraut, da ich meine Zehen noch nie in den Astrofotografie-Teich getaucht habe ... Nachdem ich das gelesen habe, wären das erste, was mir einfallen würde, einige der Tools, die ImageMagick zum Vergleichen enthält Bilder - Sie könnten jedes Bildpaar vergleichen und die Bilder mithilfe einer Art Metrik (RMS oder ähnliches) gruppieren, sodass Sie einen Stapel auswählen können, der nach dieser Metrik am "ähnlichsten" ist ... Nicht sehr automatisiert von der Stange , aber es sollte nicht zu schwer sein, etwas Muschel- oder Pythonkleber zu verwenden, um es zusammenzusetzen ...
Was ich mit meinen Bildern subjektiv gemacht habe, war, ein bestimmtes Merkmal des Felsens auszuwählen, das ein scharf definiertes, stark kontrastierendes Merkmal hatte, und ich habe einfach jedes Bild vergrößert und gesucht, welches dieses Bild am schärfsten zeigte. Als ich andere Teile des Bildes überprüfte, schien es konsistent zu sein.
@twalberg: Sie könnten jedes Bildpaar vergleichen und die Bilder mithilfe einer Art Metrik (RMS oder ähnliches) gruppieren, sodass Sie einen Stapel auswählen könnten, der nach dieser Metrik am "ähnlichsten" ist. Ja, dieser Gedanke kam mir, aber dann werden Sie vielleicht feststellen, dass die schlimmsten Bilder den schlimmsten ähnlich waren. Eine andere Möglichkeit wäre, eine FFT zu nehmen und nach einem Leistungsspektrum mit vielen hohen Frequenzen darin zu suchen, oder vielleicht einfach den RMS-Wert des diskreten Laplace-Operators zu nehmen. Aber ich bin mir sicher, dass ich nicht der Erste bin, der darüber nachdenkt, und ich möchte das Rad lieber nicht neu erfinden.
Die von Ihnen verlinkte Videotechnik würde genauso gut mit Fotos funktionieren. Der einzige Unterschied besteht darin, dass die Berechnungszeit für die Registrierung jedes Fotos wahrscheinlich quadratisch länger wäre als die Berechnungszeit für die Registrierung jedes Videorahmens (nur aufgrund der Tatsache, dass Fotos eine viel höhere Auflösung als Video haben). Aber die Technik ist immer noch die gleiche. Ich sehe keine Notwendigkeit, > 10 fps zu drehen.
Es wäre wahrscheinlich besser, mit einer niedrigeren Bildrate zu fotografieren. Das würde es Ihnen ermöglichen, bei gleicher Anzahl von Frames über einen längeren Zeitraum mehr Abwechslung bei den atmosphärischen Bedingungen zu haben.
@MichaelClark: Die 10 Bilder/Sekunde sind nicht die Geschwindigkeit, mit der ich tatsächlich fotografiere. So schnell muss man vermutlich drehen, um die im Link beschriebene Videotechnik anzuwenden. Wenn ich das richtig verstehe, nutzt diese Technik die Korrelation von einem Frame zum nächsten aus.
@BenCrowell Mein Kommentar war eine Antwort auf Scottbbs.
Das Bild, das Sie in den Wikimedia verlinkt haben, sieht nicht schlecht aus. Hast du in Raw oder JPEG gedreht? Und welche Objektive verwendest du genau?
@MikeDixon: Danke :-) Ich habe es im JPG-Format gemacht, mit einem 300 mm f/7 katadioptrischen Objektiv, aus einer Entfernung von 4,8 km. Die einzige digitale Nachbearbeitung war das Zuschneiden und eine sanfte Kontrastverstärkung.
Ich denke, wenn es roh aufgenommen und besser nachbearbeitet würde, könnte man ein besseres Ergebnis erzielen. Außerdem würde es helfen, mit einem besseren Objektiv zu fotografieren. Wie ich bereits sagte, ist das Bild nicht schrecklich, könnte aber wahrscheinlich etwas Entnebelung, Klarheit und Schärfe gebrauchen. Sogar in JPEG konnte ich es viel besser aussehen lassen.
Die Videotechnik in dem verlinkten Artikel verwendet Bilder, die mit wesentlich weniger als VGA-Auflösung im Vergleich zur 12-MP-Auflösung des verlinkten Frames aufgenommen wurden. Basierend auf dem Farbartefakt im Einzelfarbenbeispiel ist es möglicherweise besser für monochromes Video geeignet als für Farbe.
@BenCrowell Ich glaube nicht, dass die Technik das Frame-to-Frame-Timing oder die Korrelation ausnutzt. Selbst wenn dies der Fall wäre, bin ich absolut sicher, dass die Technik an die Medianfilter-Registrierung angepasst werden könnte, um ein grundsätzlich willkürliches Interframe-Timing zu ermöglichen (innerhalb der Grenzen von Inhaltsänderungen aufgrund von Beleuchtung durch den Sonnenwinkel usw.). Der Grund, warum ich davon überzeugt bin, ist, dass ich Code geschrieben habe, um etwas sehr Ähnliches wie den verknüpften Ansatz zu tun. Das Interframe-Timing war keine Einschränkung (Video war die Quelle, die ein implizites Δt hatte, aber es war überhaupt kein Faktor bei den Berechnungen).
@MichaelClark Es hat sicherlich einen gewissen Wert, mit einer hohen Bildrate zu fotografieren, aber ich glaube nicht, dass es absolut notwendig ist. Es ist eher eine "mehr Information ist eine gute Sache"-Situation. Aber aus stochastischer Sicht könnten Sie Recht haben: Ein längeres Abtastintervall würde wahrscheinlich die atmosphärischen Schwankungen glätten.

Antworten (3)

Dies ist keine endgültige Antwort auf meine eigene Frage, aber es ist zu lang für einen Kommentar.

Ich habe die Idee umgesetzt, den RMS Laplace zu verwenden. Die Idee ist, dass, wenn die Helligkeit des Bildes durch ein Array von Pixeln a[i,j] dargestellt wird, wir an jedem Punkt (i,j) die diskrete Annäherung an den Laplace-Operator L=a[i-1 haben, j]+a[i+1,j]+a[i,j-1]+a[i,j+1]-4a[i,j]. Dies misst die Schärfe von Merkmalen im Bild. Wenn das Bild beispielsweise unscharf wäre, wäre L niedriger. Der RMS-Wert des Laplace-Operators, R, ist die Quadratwurzel des Mittelwerts des Quadrats des Laplace-Operators.

Hier ist mein Code, der R für ein PNG-Eingabebild berechnet:

#!/usr/bin/ruby

# To batch convert a bunch of JPGs to png:
# perl -e '$i=0; foreach $f(<*.JPG>) {$s=sprintf("%03d",$i); $c="convert $f $s.png"; print "$c\n"; system($c); $i=$i+1;}'

require 'oily_png'

# require 'hsluv'
  # http://www.hsluv.org
  # https://github.com/hsluv/hsluv-ruby
  # sudo gem install hsluv

# Sloppy and probably not physiologically valid, but fast.
# Returns an integer from 0 to 255*3.
def color_to_brightness(c)
  return ChunkyPNG::Color::r(c)+ChunkyPNG::Color::g(c)+ChunkyPNG::Color::b(c)
end


def rms_laplacian_from_file(input_file)
  image = ChunkyPNG::Image.from_file(input_file)
  n = 0
  sum = 0
  sum_sq = 0
  w = image.width
  h = image.height
  1.upto(w-2) { |i|
    ### if i%1000==0 then print "i=#{i}\n" end # show progress
    next unless i>w/3 && i<(2*w)/3 ## for efficiency, only use center of frame
    1.upto(h-2) { |j|
      next unless j>h/3 && j<(2*h)/3 ## for efficiency, only use center of frame
      next unless rand(10)==0 # for efficiency
      a = Hash.new
      (-1).upto(1) { |k|
        (-1).upto(1) { |l|
          c = image[i+k,j+l] # color, represented as a 4-byte rgba value
          a[[k,l]] = color_to_brightness(c)
        }
      }
      laplacian = a[[1,0]]+a[[-1,0]]+a[[0,1]]+a[[0,-1]]-4*a[[0,0]]
      n = n+1
      sum = sum + laplacian
      sum_sq = sum_sq + laplacian*laplacian
    }
  }
  sum = sum.to_f/n
  sum_sq = sum_sq.to_f/n
  rms = Math::sqrt(sum_sq-sum*sum)
  return rms
end

ARGV.each { |input_file|
  rms = rms_laplacian_from_file(input_file)
  print "#{input_file} -- rms=#{rms}\n"
}

Dies ist in Ruby implementiert und läuft unter Linux mit der Open-Source-Bibliothek oily_png. Falls jemand daran interessiert ist, es auszuprobieren, es sollte fast keine Modifikation erfordern, um auf anderen Plattformen zu laufen, wenn Sie Ruby und oily_png installiert haben.

Um zu testen, ob es die Schärfe misst, habe ich das erste Bild meines Satzes von 16 aufgenommen, R gemessen und dann eine 5-Pixel-Gaußsche Unschärfe mit GIMP hinzugefügt und R erneut gemessen. Das Ergebnis war R = 30,8 vor der Unschärfe und R =7,8 nach. Dies scheint also zu bestätigen, dass es die Schärfe misst.

Meine 16 Bilder sind von 000 bis 015 nummeriert. Beim Betrachten der Bilder mit dem Auge hatte ich zuvor Bild 003 als das beste herausgesucht. Das war das Bild, zu dem ich in der Frage einen Link gepostet habe.

Ich habe meinen Code auf den 16 Aufnahmen ausgeführt, die ich gemacht hatte, und die folgende Ausgabe erhalten:

000.png -- rms=30.809465960392004
001.png -- rms=31.215359700578606
002.png -- rms=31.909926250066476
003.png -- rms=31.83243374839454
004.png -- rms=31.310612756003305
005.png -- rms=30.353258897447564
006.png -- rms=30.61244684985801
007.png -- rms=30.882745734215135
008.png -- rms=28.667104210689384
009.png -- rms=29.862966602367973
010.png -- rms=29.72001987743495
011.png -- rms=30.51274847773823
012.png -- rms=30.84316910530572
013.png -- rms=29.21751498027252
014.png -- rms=29.067434969521976
015.png -- rms=30.831305018709617

Von den 16 Bildern hatte meine Wahl den zweithöchsten R-Wert. Dies scheint zu bestätigen, dass diese Statistik eine nützliche Alternative zur Inspektion von Bildern und deren subjektiver Beurteilung durch das Auge sein könnte.

Meine Implementierung ist ziemlich langsam, und um das auszugleichen, habe ich einige Dinge getan, um die Leistung zu verbessern. Ich inspiziere nur die Mitte des Feldes und nehme den Laplace-Operator nur bei 1/10 der Punkte ab. In einer optimierteren Implementierung könnten diese Verknüpfungen nach Wunsch eliminiert werden.

Später kam mir der Gedanke, dass es einen viel einfacheren Weg geben könnte, dies zu tun. Ein Bild mit mehr Details sollte nicht so gut komprimiert werden, daher ist die größte JPG-Datei möglicherweise einfach die beste. Tatsächlich führte ein ls -lS zum Auflisten der Dateien in der Reihenfolge abnehmender Größe zu einer Liste, die fast in der gleichen Reihenfolge wie die nach abnehmendem R sortierten Dateien war:

-rw-rw-r-- 1 bcrowell bcrowell 16970354 Oct 25 15:48 003.png
-rw-rw-r-- 1 bcrowell bcrowell 16927174 Oct 25 15:48 002.png
-rw-rw-r-- 1 bcrowell bcrowell 16903104 Oct 25 15:48 004.png
-rw-rw-r-- 1 bcrowell bcrowell 16882373 Oct 25 15:47 000.png
-rw-rw-r-- 1 bcrowell bcrowell 16861082 Oct 25 15:47 001.png
-rw-rw-r-- 1 bcrowell bcrowell 16817527 Oct 25 15:48 006.png
-rw-rw-r-- 1 bcrowell bcrowell 16816529 Oct 25 15:49 011.png
-rw-rw-r-- 1 bcrowell bcrowell 16793982 Oct 25 15:49 012.png
-rw-rw-r-- 1 bcrowell bcrowell 16786443 Oct 25 15:48 009.png
-rw-rw-r-- 1 bcrowell bcrowell 16773575 Oct 25 15:48 005.png
-rw-rw-r-- 1 bcrowell bcrowell 16771759 Oct 25 15:49 010.png
-rw-rw-r-- 1 bcrowell bcrowell 16765674 Oct 25 15:48 007.png
-rw-rw-r-- 1 bcrowell bcrowell 16764562 Oct 25 15:49 015.png
-rw-rw-r-- 1 bcrowell bcrowell 16750179 Oct 25 15:48 008.png
-rw-rw-r-- 1 bcrowell bcrowell 16732854 Oct 25 15:49 013.png
-rw-rw-r-- 1 bcrowell bcrowell 16684073 Oct 25 15:49 014.png
Gute Arbeit. Was ich interessant und konsistent mit der herkömmlichen nicht-quantitativen Praxis finde, ist, dass die ersten aufgenommenen Bilder die besten Bilder sind (nach den Kriterien). Vielleicht war das einfach nur Glück. Vielleicht war es nur ein gewöhnliches fotografisches Urteil darüber, wann der Verschluss geschlossen werden sollte. Eine Grafik könnte helfen.
In Bezug auf die Komprimierung führt mehr zufälliges Rauschen zu größeren Dateien, und dieses Rauschen kann in einem oder mehreren der Farbkanäle anstelle oder zusätzlich zu dem Luminanzkanal auftreten, über den der Algorithmus arbeitet. Bei niedrigen ISO-Werten mit gut beleuchteten Motiven ist dies weniger wahrscheinlich ein Problem ... obwohl die Auswahl geeigneter Motive bei der Anwendung der Dateigröße als Maß für die Schärfe vielleicht eine Frage des fotografischen Urteilsvermögens ist.

Gibt es eine Möglichkeit, den Prozess der Suche nach den Glücksbildern aus einer Reihe von Landschaftsfotos wie diesem zu automatisieren?

So wie ich es verstehe, ist Ihre Definition von "Glücksbild" eine, die schärfer als der Durchschnitt ist. Da viele Kameras die Messung der Schärfe (eines Bereichs) eines Bildes in ihren Autofokusmechanismen verwenden 1 , ist klar, dass es eine Möglichkeit gibt, ihre Messung zu automatisieren. Die Vorteile verschiedener Ansätze und die Möglichkeit, sie zu kombinieren, sind jedoch Gegenstand aktiver Forschung, sodass Sie keine endgültige Antwort erwarten können. Eg Robust Automatic Focus Algorithm for Low Contrast Images Using a New Contrast Measure , Jinshan Tang et. al., Sensors (2011) sagt das

Viele Kontrastmessungen wurden für passiven AF verwendet ... Die Ergebnisse zeigen, dass räumliche 2D-Messmethoden wie Tenengrad, Prewitt Edge Detection und Laplacean die beste Leistung in Bezug auf Genauigkeit und Unimodalität liefern. Sie sind jedoch sehr empfindlich gegenüber Rauschen und nicht robust gegenüber unterschiedlichen Szenenbedingungen, wie z. B. schlechten Lichtverhältnissen.

Im Gegensatz dazu sind varianzbasierte Methoden schnell und robust. Die Grundidee besteht darin, die Varianz der Bildintensität zu berechnen. Das Bild ist am besten fokussiert, wenn die Varianz ein Maximum erreicht. Ein typisches Verfahren im Bereich der diskreten Kosinustransformation (DCT) besteht darin, die AC-Koeffizienten von Bildern zu berechnen, die auch verwendet werden können, um Informationen über die Varianzfunktion der Leuchtdichte darzustellen.

Da Sie nicht auf die Echtzeitleistung eines leistungsschwachen Prozessors in der Kamera beschränkt sind, könnten Sie wahrscheinlich mehrere Ansätze implementieren und versuchen, ihre Ergebnisse zu kombinieren. Sie sprechen von Stapeln, also nehme ich an, dass Sie mehrere Aufnahmen aus derselben Position bei ungefähr denselben Lichtverhältnissen gemacht haben: Es könnte sich lohnen, eher über das Zusammenfügen als über das Stapeln nachzudenken, damit Sie das Foto auswählen, das in einem Bereich den besten Kontrast aufweist. und das Foto, das den besten Kontrast zu einem anderen hat, und fügen Sie sie zusammen. Ich bin mir nicht sicher, inwieweit vorhandene Stitching-Software diese Art von Kontrastauswahlstich unterstützt.


1 Um genau zu sein, diejenigen, die den Kontrasterkennungs-Autofokus im Gegensatz zum Phasenerkennungs-Autofokus verwenden. Und ja, ich weiß, dass DSLRs mit Live-View PDAF mit heruntergeklapptem Spiegel und CDAF in Live-View verwenden.

Dies ist wahrscheinlich zu weit entfernt, um von großem Interesse zu sein, aber: Der Laplace-Operator verstärkt in einer Dimension den Hochfrequenzgehalt, indem er das Fourier-Spektrum mit dem Quadrat der Frequenz multipliziert. (Ich hoffe, ich habe das richtig verstanden.) Es verstärkt also sowohl das Rauschen als auch das Signal. Es könnte interessant sein zu sehen, ob ein Kantendetektor interessante Merkmale extrahieren könnte. Bei einem bestimmten Kantendetektor wäre vielleicht das Foto mit der längsten Gesamtkantenlänge von Interesse. Das könnte nur Schwanzjagd sein, aber vielleicht auch nicht?