from PIL import Image import matplotlib.pyplot as plt import matplotlib from scipy.signal import find_peaks import colorsys import glob fd = 'C:/Users/Hobbyraum/Documents/Spektrometer/' def fullhue(rgb): if sum(rgb)==0: return rgb rgb = rgb[0]/256.0,rgb[1]/256.0,rgb[2]/256.0 hls = colorsys.rgb_to_hls(*rgb) return colorsys.hls_to_rgb(hls[0],0.5,1.0) def analyse(fn,ax,spectra): print(fn,end='') im = Image.open(fn) rx = range(im.width) ry = range(im.height//6,im.height*5//6) print(' %s'%ry,end='') iml = im.convert('L') rows = [] d = list(iml.getdata()) lumrow = list(sum(d[y*im.width:(y+1)*im.width]) for y in ry) span = 64 lumspan = list(sum(lumrow[y:y+span]) for y in range(len(lumrow)-span+1)) peaks,props = find_peaks(lumspan,height=(None,None),distance=160) lumsums = props['peak_heights'] lspl = sorted(zip(lumsums,range(len(lumsums))),key=lambda lspi:lspi[0],reverse=True)[:spectra] if spectra>1: #fig2,ax2 = plt.subplots() #ax2.plot(range(len(lumspan)),lumspan) #ax2.plot(peaks,list(lumspan[peak] for peak in peaks),'x') print(lumsums) for spectrum in range(spectra): lumsum,pi = lspl[spectrum] peak = peaks[pi] ryp = range(peak+ry.start,peak+span-1+ry.start) print(' %s'%ryp,end='') ly = list(0 for x in rx) for x in rx: for y in ryp: ly[x] += d[y*im.width+x] scaling = 256.0*im.height if spectra==1 else max(ly) ly = list(l/scaling for l in ly) #ym = max(ly) #for x in lx: # ly[x] /= ym imcr = im.crop((0,ryp.start,im.width,ryp.stop)) imco = imcr.resize((imcr.width,1),Image.Resampling.BOX); lc = list(fullhue(imco.getpixel((x,0))) for x in rx) #xaxis = list(x+250*spectrum for x in rx) ax.scatter(rx,ly,2,lc,alpha=0.4) print() def figure(fng,spectra=1): fig,ax = plt.subplots() for fn in glob.glob(fd+fng): analyse(fn,ax,spectra) figure('loamlin-w4.png',4) figure('loamlin-rgb4.png',4) figure('black*.png') figure('halogen.png') figure('ikealed.png') figure('loamlin-[rgbw].png') figure('btf-[rgbw].png') plt.show() print('Done.')