Estas bandas de espectro solían ser juzgadas a ojo, ¿cómo hacerlo programáticamente?

Los operadores solían examinar el espectro, conociendo la ubicación yanchura De cada pico y juzga la pieza a la que pertenece el espectro. De la nueva forma, la imagen es capturada por una cámara a una pantalla. Y el ancho de cada banda debe ser computado programáticamente.

Sistema antiguo: espectroscopio -> ojo humano Nuevo sistema: espectroscopio -> cámara -> programa

¿Qué es un buen método paracalcular el ancho de cada banda, dadas sus posiciones aproximadas del eje X; ¿Dado que esta tarea solía ser realizada a simple vista, y ahora debe ser realizada por programa?

Lo siento si me faltan detalles, pero son escasos.

Listado de programas que generó el gráfico anterior; Espero que sea relevante:

import Image
from scipy import *
from scipy.optimize import leastsq

# Load the picture with PIL, process if needed
pic         = asarray(Image.open("spectrum.jpg"))

# Average the pixel values along vertical axis
pic_avg     = pic.mean(axis=2)
projection  = pic_avg.sum(axis=0)

# Set the min value to zero for a nice fit
projection /= projection.mean()
projection -= projection.min()

#print projection

# Fit function, two gaussians, adjust as needed
def fitfunc(p,x):
    return p[0]*exp(-(x-p[1])**2/(2.0*p[2]**2)) + \
        p[3]*exp(-(x-p[4])**2/(2.0*p[5]**2))
errfunc = lambda p, x, y: fitfunc(p,x)-y

# Use scipy to fit, p0 is inital guess
p0 = array([0,20,1,0,75,10])
X  = xrange(len(projection))
p1, success = leastsq(errfunc, p0, args=(X,projection))
Y = fitfunc(p1,X)

# Output the result
print "Mean values at: ", p1[1], p1[4]

# Plot the result
from pylab import *
#subplot(211)
#imshow(pic)
#subplot(223)
#plot(projection)
#subplot(224)
#plot(X,Y,'r',lw=5)
#show()

subplot(311)
imshow(pic)
subplot(312)
plot(projection)
subplot(313)
plot(X,Y,'r',lw=5)
show()

Respuestas a la pregunta(3)

Su respuesta a la pregunta