Hallo Beisammen,
Zur Ausrichtung von HA Bildern der Sonne habe ich mal einen eigenen Ansatz im Python Numerik-Paket (numpy) verfolgt. Dabei wird das Probebild zur Referenz verschoben und dann die Passung getestet. Qualitätsfunktion für die Passung ist PixelSumme(Abs(Probe-Referenz)). Der Verschiebungsvektor bei dem das Minimum der Qualitätsfunktion liegt wird dann genommen. Bei einem Suchbereich von 80x80Pixel reichen etwa 20sek pro Bild. (Natürlich wird hier Drehung vernachlässigt)
Das fertige Zeitraffer Video ist oben auf meinem HA-Beobachtungs Log:
http://drgert.dyndns.ws:8000/s…/solar_campaign_2014.html
Oder im direkten Link:
http://drgert.dyndns.ws:8000/s…t_20141109_crf24_8fps.mp4
Für die Python Experten hänge ich das skript mal an und bitte um Verbesserung.
Meine Frage hängt mit einem Seitenaspekt zusammen. Plots der Qualitätsfunktion als 80x80 Farbgrafik zeigen den Extrempunkt an einem (gefühlt) falschen Ort. Mein skript gibt für ein Bild die Verschiebekoordinaten aus, wo die Passung am besten ist. Sei das mal dx=-7 und dy=3. Wenn ich dann das Array der Qualitätswerte plotte erscheint der Peak am 'falschen' Ort. (Jedenfalls nicht bei negativer X-achse)
Ich vermute die Ursache meines Gefühls ist mein Unverständnis der Beziehung zwischen Matrix Indizierung und Plot Darstellung in numpy. Es wäre schön, wenn das ein Pythoniker höheren Grades mir mal korrekt erklären könnte.
Vielen Dank & Clear Skies,
Gert
#!/usr/bin/python
import matplotlib.pyplot as plt
import scipy.misc as msc
import numpy as np
import os
import glob
import re
# Negative or nothing
non = lambda s: s if s<0 else None
# Positive or zero
mom = lambda s: max(0,s)
rfn = lambda n: glob.glob(inpath + '/Sun_20141109_' + str(n) + '_*.png')[0]
wfn = lambda fn: re.sub('Reg6_png','npy2reg',fn)
pfn = lambda fn: re.sub('\.png','_corr.png',fn)
inpath = './sunspot_20141109/Reg6_png'
search_size = 40
fp= rfn(6)
op= wfn(fp)
prev_img_rgb = msc.imread(fp)
#msc.imsave(op,prev_img_rgb)
prev_img = np.mean(prev_img_rgb, -1)
for imgnum in range (7,24):
fn= rfn(imgnum)
img_rgb= msc.imread(fn).astype('float')
img = np.mean(img_rgb, -1)
q = np.zeros((2*search_size,2*search_size))
for xs in range(-search_size,+search_size):
for ys in range(-search_size,+search_size):
img_shift = np.zeros_like(img)
img_shift[mom(ys):non(ys), mom(xs):non(xs)] = img[mom(-ys):non(-ys), mom(-xs):non(-xs)]
d = np.absolute(img_shift - prev_img)[50:-50,50:-50]
q[xs+search_size,ys+search_size] = np.sum(d)
idxmin = np.argmin(q)
xmin,ymin = np.unravel_index(idxmin, q.shape)
xmin= xmin-search_size
ymin= ymin-search_size
img_shift_rgb = np.zeros_like(img_rgb)
img_shift_rgb[mom(ymin):non(ymin), mom(xmin):non(xmin)] = img_rgb[mom(-ymin):non(-ymin), mom(-xmin):non(-xmin)]
print 'dx= %+2d dy= %+2d : %s' % ( xmin, ymin, fn )
ofn= wfn(fn)
msc.imsave(ofn,img_shift_rgb)
fig= plt.figure(1)
im= plt.imshow(q, cmap='rainbow', interpolation='none')
fig.savefig(pfn(ofn), bbox_inches='tight')
prev_img= np.mean(img_shift_rgb, -1)
Alles anzeigen