Evaluación del algoritmo
En esta sección se observa el resultado de las distintas evaluaciones al algoritmo MSSR.
Visualizaciones según tratamiento temporal del stack de imágenes
Distintos tratamientos temporales producen diferentes imágenes. Cada uno tiene sus ventajas y desventajas. Usar la mediana tiene la ventaja de eliminar los outliers pero puede ser que no estemos capturando el fenómeno en su totalidad ya que nada garantiza que se capture el fenómeno completo. Si el fenómeno parpadea muy rápidamente posiblemente sea mejor utilizar la varianza ya que alcanzaremos a capturar más de él pero si es una imagen continua se podria perder información. La opción de usar la media tiene en cuenta los outliers y podría producir resultados no esperados. A continuación se muestran resultados de aplicar el algoritmo con Ampliación=5 , hs=3 y Orden=1.
Diferencias en la visualización de distintos parámetros
Dejando fijos la ampliación en 5 y el hs en 3 nos disponemos a ver el efecto de la variación del orden en nuestro algoritmo. Se puede ver cómo a medida que se incrementa el orden la imagen tiende a mantener el valor del punto más brillante mientras mantiene el resto de la estructura cada vez más apagada pero nunca difuminandóse. En esta sección se emplea un procesamiento temporal de media a todas las imágenes.
Dejando fijo el orden en 0 y el hs en 3 procedemos a variar la ampliación. Aqui se puede apreciar como si bien el zoom es digital y un producto matemático nos permite tener más resolución siendo tratado por el algoritmo.
Por ultimo dejamos fijos el orden en 0 y la ampliación en 5 y procedemos a variar el hs. En esta imagen es donde se ven menos cambios lo cual es coherente ya que el principal propósito de la variación del ancho del kernel es determinar que solo le estemos aplicando el algoritmo a una sola estructura de interés que es el caso para todas las imágenes de prueba.
Tiempos de ejecución
Debido a ser un algoritmo robusto que puede ser usado con una infinidad de parámetros parece ser de vital importancia el tiempo de ejecución. Es por esto que se decide ahondar en cómo evolucionan a medida que varían los parámetros. Los parámetros base con los que se calculó el algoritmo son Orden=0, Ampliación=5, hs=3 y un procesamiento temporal de media, variándose cada uno para ver su evolución a través del tiempo.
El tamaño de la imagen parece hacer escalar al tiempo de manera cuadrática.
El tamaño del kernel parece hacer escalar al tiempo de manera cuadrática.
El orden parece no tener una relacion cuadratica con el tiempo. También es importante notar cómo incrementar el orden solo implica enlentecer operaciones aritmeticas sobre la imagen debidoa que ya fue calculada la media desplazada por lo que los tiempos de procesamiento parecen ser mucho menores.
Importancia del kernel espacial
En el cálculo de la media desplazada se emplea una ponderación gaussiana con respecto al punto central. Se trata de una operación que puede llegar a ser computacionalmente costosa asi que se decidió fijarse los efectos que tiene en tiempos de ejecución y en resultados. Para esto se removió el código del algoritmo resultando de la siguiente manera:
Implementación en python
def sfMSSRSNOESPACIAL(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)
#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:
HS=Ipad[hs+i:width+hs+i,hs+j:height+hs+j]
kernelIntensidad=np.exp(-pow((img-HS)/M,2))
Pesos=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
Como primer experimento parece interesante ver si la diferencia de no usar esta ponderación en la cuenta tiene algún efecto apreciable por el ojo humano. Para esto se procede a mostrar las imágenes obtenidas con los parámetros Aplicación=5 , hs=3 , Orden = 1 y un procesamiento temporal de media.
Más allá de las comparaciones que podemos hacer con nuestra vista parece relevante ver qué diferencia objetiva hay entre ambas imágenes. Para esto tomamos la diferencia media entre ambas imagenes, la diferencia máxima y la diferencia acumulada
Tipo de diferencia | Valor(px) |
---|---|
Diferencia media |
0.1315602703735406 |
Diferencia máxima |
11.33741501570907 |
Diferencia acumulada |
2397.685927557777 |
Una vez determinada que no hay mucha diferencia entre las imágenes procedimos a ejecutar 1000 veces ambos algoritmos en la misma imagen con los mismos parámetros. Encontramos que hay una diferencia en el tiempo de corrida promedio de 0.0011773517131805425 segundos lo que se traduce a una mejora del 5,6% en los tiempos de corrida.