Sony Star Eater Algorithmus in Darkframes

NablaDelta

Aktives Mitglied
Hallo zusammen,

als Sony-DSLR-Besitzer beschäftigen mich die spatial filter (star-eater) Algorithmen natürlich sehr. Was mich beim Lesen im Internet sehr wundert, ist, dass immer wieder darüber diskutiert wird, ob es bei bestimmten Kameras und/oder Einstellungen einen solchen Algorithmus nun gibt, oder nicht. Als Beweis halten oft schwierige Bilder, teilweise sogar Stacks her.

Dabei ist es doch ganz einfach, jeder Sensor hat Hotpixel, und anhand der Zahl der Hotpixel erkennt man bereits im Darkframe (!) sofort, ob die Kamera den Algorithmus angewandt hat, oder nicht. Angehängt als Beispiel zwei 500x500-Ausschnitte aus 30 Sekunden Darkframes meiner Sony A7 II einmal im Bulb- und einmal im Einzel-Modus, jeweils genau gleich bearbeitet. Man erkennt allein anhand der deutlich reduzierten Zahl der Hotpixel, dass im Bulb-Modus der Star Eater Algorithmus angewendet wurde. Außerdem bleiben auch wie bei Sternen ein paar typische Hotpixel-Paare übrig. Testfotos am Sternenhimmel, deren Ergebnis u.a. von der Qualität der Nachführung bzw. der Belichtungszeit abhängig sind, sind also m.E. gar nicht notwendig?

Wie bei jedem Kommentar zu diesem ärgerlichen Algorithmus: Hier noch der Link zur Petition, gerne unterschreiben :)

Viele Grüße
Clemens


Darkframe_30sek_Bulb_Einzel.gif
 
Hallo Clemens,

das ist ein wirklich krasser Unterschied. Sind die beiden Frames tatsächlich bei der gleichen Sensortemperatur aufgenommen?
Kennst du den Algorithmus von Mark Shelley? Der verwendet auch Darks und lässt auch noch Rückschlüsse zu, wie gefiltert wurde.

Gruß, Erwin
 
Hallo Erwin,

ja, die beiden Bilder sind direkt hintereinander bei Raumtemperatur aufgenommen. Hier noch die entsprechenden Histogramme dazu:

Image_histogram.png


Den Algorithmus von Mark Shelley kannte ich noch nicht, das sieht tatsächlich sehr interessant aus! Weißt du zufällig ob es dazu einen veröffentlichten Code gibt, den ich über meine Bilder laufen lassen könnte?

Danke und CS
Clemens

PS: "DSLR" in meinem ersten Post war falsch, sind ja Spiegellose :)
 
Hallo Clemens,

wenn ich mir die Histogramme so anschaue, verstehe ich jetzt auch, warum Sony dran rumverbessert. Das kenne ich von meinen Canons so nicht.
Könntest du mir evtl. die beiden RAWs mal zukommen lassen?
Ob Mark Shelley seinen Code veröffentlicht hat, weiß ich nicht. Ich habe mir für meinen Stacker ein Script geschrieben, das die Berechnung durchführt. Wenn du magst, kann ich dir gern zeigen, wie man es einsetzt.

CS, Erwin
 
Hallo Erwin,

klar, die RAWs schicke ich dir als Link per PN. Vorsicht bei den Histogrammen, die sind logarithmisch aufgetragen ;)
Danke für den Tipp und das Angebot! Ich denke ich versuche mich dann auch erstmal selbst an einem Skript, so kompliziert ist die Berechnung ja nicht, wenn dann eher die Performance und das Zeichnen. Ansonsten komme ich gerne auf dein Programm zurück :)

CS, Clemens
 
Hallo zusammen,

dank Erwins Hilfe habe ich den Algorithmus von Mark Shelley nun auch hinbekommen und kann mit einem einfachen Python Skript meine Kameras testen. Der Star Eater Algorithmus ist bei meiner Sony A7 II im Bulb-Modus tatsächlich eindrucksvoll zu erkennen. Ich habe auch getestet, ob die Reihenfolge einen Unterschied macht, was allerdings nicht der Fall ist. Neben dem Setzen von Pixeln auf das Maximum ihrer Nachbarn fällt außerdem auf, dass die Bittiefe von 14 auf 12 bit reduziert wird, wenn auch weiterhin in 14 bit gespeichert.

_Vergleich1.png


Außerdem habe ich den Einfluss des elektronischen ersten Shutters, der RAW-Compression und der Langzeit-NR getestet. Die ersten beiden machen in der Pixelmap keinen merklichen Unterschied, die Langzeit-NR natürlich schon, allerdings nirgends eine Tendenz zu ähnlichen Effekten wie beim Star-Eater Algorithmus.

_Vergleich2.png


Im folgenden noch der Python-Code.
CS Clemens

Python:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import rawpy

filename = 'FILENAME'
im = rawpy.imread(filename + '.ARW').raw_image_visible
#im = im[:500, :500] # for testing
im_ = im.flatten()

rows = len(im[:,0])
cols = len(im[0,:])
maxneighbors = np.zeros((rows, cols))
for i in range(1):
    for n in range(rows):
        for m in range(cols):
            neighbors = []
            for nd in [-2,0,2]:
                for md in [-2,0,2]:
                    if not (nd == 0 and md == 0):
                        try:
                            neighbors.append(im[n+nd, m+md])
                        except:
                            pass
            maxneighbors[n, m] = max(neighbors)

maxneighbors_ = maxneighbors.flatten()

fig = plt.figure(figsize=(7,5))
plt.rcParams['font.size'] = 14
plt.hist2d(maxneighbors_, im_, bins=300, range=[[0, 2000], [0, 2000]], norm=mpl.colors.LogNorm(), cmap=plt.cm.jet)
#plt.xticks(range(100,20000,200))
#plt.yticks(range(100,20000,200))
plt.xticks([])
plt.yticks([])
plt.xlim([300, 1500])
plt.ylim([300, 1500])
plt.xlabel('Max of 8 neighbors')
plt.ylabel('Pixel value')
plt.colorbar()
plt.gca().set_aspect('equal')
fig.tight_layout()
plt.savefig(filename + '_pixelmap.png', dpi=300)
plt.show()
 
Zurück
Oben