Métodos
En esta página se describen los métodos y técnicas utilizados en el proyecto. Se explican los algoritmos estudiados, las herramientas usadas y las tecnologías y procesos implicados en la construcción del proyecto.
Imagen inicial
Se utilizan imágenes de una estructura fork sintética que esta parpadeando. En un principio las imagenes que tenemos son parecidas a la siguiente:
Tratamiento temporal
Debido a la naturaleza del fenómeno en una imagen instantánea podemos no tener toda la información requerida, es por esto que se implementa una pequeña parte de análisis temporal. Para esto se decidirá trabajar con varias imágenes del mismo objeto observado a lo largo del tiempo y se procederá a realizarle operaciones matemáticas al stack de imágenes. Dependiendo de las caraceterísticas podemos querer la media , la mediana o la varianza.
Ampliación
Posteriormente ya que contamos con imágenes relativamente pequeñas (27px x 27px) se procede a aumentar su tamaño con una interpolación bicúbica mediante la función de scipy zoom obteniendo los siguientes resultados:
Cálculo de MSSR
Se procede al cálculo de la media desplazada(MS), para esto es necesario la determinación de un parámetro hs que es representativo del tamaño del kernel, el mismo tiene la finalidad de separar la estructura de interés.En este paso se recorre la imagen con un kernel (de lado hs) con pesos exponenciales y restar a esta ponderación el valor del pixel central, una vez recorrida la imagen tenemos el vector MS. Es importante notar que implementarlo de esta manera es poco práctico computacionalmente y tiene tiempos ordenés de magnitud superiores a la implementación que se realizó, esta implementación es equivalente a "pasar la imagen por el kernel" y fue recomendada por el tutor. Una vez calculada la MS se toma el opuesto de los valores, posteriormente transformamos los valores negativos de la imagen a 0 y después normalizamos. En esta etapa ya tenemos una imagen con mejor resolución pero podemos seguir aplicando operaciones matemáticas para seguir refinando nuestra imagen.
Implementación en python
def sfMSSR(img,ampliacion,hs,order,temporal=None):
#Procesamiento temporal
if temporal=='mean':
img = np.mean(img,axis=0)
elif temporal == 'var':
img = np.var(img,axis=0)
elif temporal == 'median':
img=np.median(img,axis=0)
#Ampliamos la imagen con un factor de ampliación e interpolacion bicubica
img = zoom(img, ampliacion, order=3)
width , height = img.shape
#Padeamos la imagen para poder recorrerla
Ipad=np.pad(img,hs,'symmetric')
#Guardamos la diferencia máxima entre el punto y el ancho de banda para normalizar
M=np.zeros((width,height))
for i in range(-hs,hs+1):
for j in range(-hs,hs+1):
if i!=0 and j!=0:
HS=Ipad[hs+i:width+hs+i,hs+j:height+hs+j]
M=np.maximum(M,np.abs(img-HS))
PesosAcum=np.zeros((width,height))
ValoresAcum=np.zeros((width,height))
#Recorremos el filtro con la imagen(Es una optimización necesaria para no recorrer la imagen)
for i in range(-hs,hs+1):
for j in range(-hs,hs+1):
if i!=0 and j!=0:
kernelEspacial=np.exp(-(pow(i,2)+pow(j,2))/pow((hs),2))
HS=Ipad[hs+i:width+hs+i,hs+j:height+hs+j]
kernelIntensidad=np.exp(-pow((img-HS)/M,2))
Pesos=kernelEspacial*kernelIntensidad
PesosAcum=PesosAcum+Pesos
ValoresAcum=ValoresAcum+Pesos*HS
MS=img-(ValoresAcum/PesosAcum)
MS[MS<0]=0
MS[np.isnan(MS)]=0
I0=MS/max(map(max,MS))
I3=I0
x3= img/max(map(max,img))
for i in range(order):
#Calculamos la diferencia entre la original y la imagen MS ambas normalizadas
I4 = x3 - I3
#Calculamos el complemento hasta el máximo
I5 = max(map(max, I4)) - I4
#Normalizamos
I5 = I5/max(map(max, I5))
#Realizamos el intensity weighting
I6 = I5*I3
#Normalizamos de nuevo
I7 = I6/max(map(max, I6))
x3 = I3
I3 = I7
I3[np.isnan(I3)] = 0
IMSSR = I3*img
return IMSSR