1. Escriba una función para realizar convolución separable con 2 kerneles arbitrarios h1, h2, usando las funciones ConvR y ConvC de la biblioteca proc2D que realizan convoluciones con un renglón y una columna de una imagen, respectivamente.
    void conv(float **f,float **g,float *h1,int nh1,float *h2,int nh2,int nr,int nc)
    {
     float **nuevo;
     int i;
     nuevo=new float*[nr];
     for (i=0;i<nr;i++)
      {
       nuevo[i]=new float[nc];
       ConvR(f,nuevo,h1,nh1,nc,i);
      }
     for (i=0;i<nc;i++)
      {
       ConvC(nuevo,g,h2,nh2,nr,i);
      }
     for (i=0;i<nr;i++)
      delete[] nuevo[i];
     delete[] nuevo;
    }
    
  1. Calcule el ahorro computacional (en %) al usar convolución separable para un kernel Gaussiano de varianza 10 que se trunca para |x| > 3s

    Primero se tiene que calcular el numero en el que se trunca el kernel, esto es, calcular el entero máximo n que satisface:


    Por lo que basta tomar n=9. Por lo tanto, el tamaño del kernel es y el ahorro computacional es de .
  1. Grafique ejemplos de kerneles Gaussiano, de caja y binomial en 2D para distintos valores de sus parámetros. Aplíquelos a una imagen a la que se la haya añadido ruido y grafique tanto las imágenes suavizadas, como un renglón específico de cada una de ellas. Comente sobre las diferencias de comportamiento.

    Esta es la imagen utilizada (con ruido normal de sigma=4) generada de la siguiente forma (el renglon es el 64):

    imag(2) = rgauss(128,128)
    imag(2) = imag(2) * 4
    imag(1) = imag(1) + imag(2)


    Para el caso de la Gaussiana generé tres kerneles, con sigmas 1, 5 y 20 respectivamente, este es el script y los resultados:

    imag(2) = impulso(128,128,64,64)
    imag(4) = suavgauss(imag(2),1)
    imag(5) = suavgauss(imag(2),10)
    imag(6) = suavgauss(imag(2),20)
    imag(7) = suavgauss(imag(1),1)
    imag(8) = suavgauss(imag(1),10)
    imag(9) = suavgauss(imag(1),20)




    Para el de caja utilicé 3, 10 y 30 como anchos, este es el script y los resultados:

    imag(4) = suavcaja(imag(2),3)
    imag(5) = suavcaja(imag(2),10)
    imag(6) = suavcaja(imag(2),30)
    imag(7) = suavcaja(imag(1),3)
    imag(8) = suavcaja(imag(1),10)
    imag(9) = suavcaja(imag(1),30)




    Para el kernel binomial utilice los de orden 1,5 y 10; este es el script y los resultados:

    imag(4) = suavbinom(imag(2),1)
    imag(5) = suavbinom(imag(2),5)
    imag(6) = suavbinom(imag(2),10)
    imag(7) = suavbinom(imag(1),1)
    imag(8) = suavbinom(imag(1),5)
    imag(9) = suavbinom(imag(1),10)





    Creo que el kernel binomial es un muy buen suavisador pues es el que quito muy bien el ruido y no se perdio definición en el caso del de orden 10. El kernel de caja va dejando unos picos en la gráfica (no la hace tan suave) en cambio, el binomial y el gaussiano si suavisan esos picos, ademas se ve mejor y se alcanzan a reconocer mas los objetos con los kerneles binomial y gaussiano que con el de caja.


    Este es un experimento utilizando un kernel con forma de piramide (triangular si se restringe a una dimension), en el primer caso el kernel es la suma de dos en 1-d y en el segundo es el producto (kernel separable)

    imag(2) = rampax(7,7,1.0)
    imag(2) = imag(2) - 3
    imag(2) = abs(imag(2))
    imag(2) = imag(2) * -1
    imag(2) = imag(2) + 3
    imag(3) = rampay(7,7,1.0)
    imag(3) = imag(3) - 3
    imag(3) = abs(imag(3))
    imag(3) = imag(3) * -1
    imag(3) = imag(3) + 3
    imag(3) = imag(2) + imag(3)
    imag(3) = imag(3) / 126
    imag(11) = convolucion(imag(1),imag(3))




    imag(2) = rampax(7,7,1.0)
    imag(2) = imag(2) - 3
    imag(2) = abs(imag(2))
    imag(2) = imag(2) * -1
    imag(2) = imag(2) + 4
    imag(3) = rampay(7,7,1.0)
    imag(3) = imag(3) - 3
    imag(3) = abs(imag(3))
    imag(3) = imag(3) * -1
    imag(3) = imag(3) + 4
    imag(3) = imag(2) * imag(3)
    imag(3) = imag(3) / 256
    imag(11) = convolucion(imag(1),imag(3))



  1. Calcule manualmente (por convolución repetida con (1,1)) los operadores binomiales en 1-D de orden 2,3,4, y 5.

    Orden 1
    x01
    h(x)11
    Orden 2 (h*h)
    x012
    sum h(i)h(x-i)h(0)h(0-0)=1h(0)h(1-0)+h(1)h(1-1)=1+1=2h(1)h(2-1)=1
    Orden 3 (h2*h)
    x0123
    sum h2(i)h(x-i)h2(0)h(0-0)=1h2(0)h(1-0)+h2(1)h(1-1)=1+2=3h2(1)h(2-1)+h2(2)h(2-2)=2+1=3h2(2)h(3-2)=1
    Orden 4 (h3*h)
    x01234
    sum h3(i)h(x-i)h3(0)h(0-0)=1h3(0)h(1-0)+h3(1)h(1-1)=1+3=4h3(1)h(2-1)+h3(2)h(2-2)=3+3=6h3(2)h(3-2)+h3(3)h(3-3)=3+1=4h3(3)h(4-3)=1
    Orden 5 (h4*h)
    x012345
    sum h4(i)h(x-i)h4(0)h(0-0)=1h4(0)h(1-0)+h4(1)h(1-1)=1+4=5h4(1)h(2-1)+h4(2)h(2-2)=4+6=10h4(2)h(3-2)+h4(3)h(3-3)=6+4=10h4(3)h(4-3)+h4(4)h(4-4)=4+1=5h4(4)h(5-4)=1


  2. Grafique usando Calimán el kernel binomial de orden 17. ¿ Cuál será el parámetro sigma del kernel Gaussiano que lo aproxima ? Grafique este kernel.


    Al utilizar el siguiente script se obtienen kerneles muy parecidos (usar sigma=3)
    imag(1) = impulso(1,128,0,64)
    imag(1) = suavbinom(imag(1),16)
    imag(1) = suavbinom(imag(1),1)
    imag(1) = imag(1) / 0.06997496
    imag(2) = impulso(1,128,0,64)
    imag(2) = suavgauss(imag(2),3)
    imag(2) = imag(2) / 0.1329846
    imag(3) = imag(1)-imag(2)





  1. Verifique que (1,-1) es un diferenciador numérico, generándolo con el botón /derivadas/conv[7,7] de Calimán y aplicándolo a:
    1. una rampa
    2. una cuadrática
    3. una cúbica
    4. una Gaussiana


    Quité la primer columna de las imágenes ya que la derivada en esos puntos no permitia ver muy bien el resto de la gráfica ya que en la convolución no circular se utiliza un cero en los valores fuera de la imagen.
    FunciónDerivada


  1. Demuestre, usando las propiedades de la convolución, que aplicar el operador de derivada Gaussiana es equivalente a derivar la señal previamente suavizada con un kernel Gaussiano de la misma sigma.


    Sean DG el operador de la derivada gaussiana con sigma s, D el operdaor derivada, G un kernel gaussiano con sigma s y f una imagen. Se tiene:

    DG*f=(D*G)*f=D*(G*f)


    Esto por que DG es un operador que esta compuesto por un operador derivada y un operador gaussiano y además la convolución es asociativa.

  2. Demuestre la propiedad anterior en forma numérica usando Calimán.

    imag(2) = suavgauss(imag(1),1)
    imag(3) = dxatras(imag(2))
    imag(4) = impulso(128,128,64,64)
    imag(4) = suavgauss(imag(4),1)
    imag(4) = dxatras(imag(4))
    imag(5) = convolucion(imag(1),imag(4))
    imag(6) = imag(5) - imag(3)



  1. La aproximación por diferencias finitas a la primera derivada es la primera diferencia: f’(x) = f(x) - f(x-1). Empleando este esquema, indique cuales son las aproximaciones en 2-D al gradiente, a la magnitud del gradiente y al Laplaciano. ¿ Cuales de estos operadores son lineales ? ¿ Cuales son los kerneles de convolución correspondientes ?

  1. Las diferencias entre 2 suavizadores a distintas escalas indican el detalle perdido alpasar de una escala a otra. Para una imagen de prueba, calcule las diferencias entre los resultados de los suavizadores con sigmas 1 y 2. ¿ Que indica el valor absoluto de esta diferencia ?

    imag(2) = suavgauss(imag(1),1)
    imag(3) = suavgauss(imag(1),2)
    imag(4) = imag(2) - imag(3)
    imag(5) = abs(imag(4))


    El valor absoluto de la diferencia marca los lugares en losque se presentan picos mas grandes, es decir lugares que los que el cambio en la imagen es mas rápido.

  1. Construya, usando Calimán, un detector de bordes aplicando un umbral a la magnitud del gradiente Gaussiano de una imagen. Este detector tiene 2 parámetros: el parámetro de escala sigma y el umbral u. Experimente con diferentes valores de estos parámetros en al menos 2 imágenes diferentes.
  2. Otro detector de bordes puede construirse encontrando los cruces por cero del Laplaciano Gaussiano de una imagen. En este caso se tiene sólo el parámetro sigma. Repita los experimentos del ejercicio 1 con este detector para doferentes valores de sigma.
  3. En lugar de cruces por cero,onstruya una imagen que valga 0 si el valor absoluto del laplaciano es menor que cierto umbral, y 1 de otro modo. Experimente con distintos umbrales.
  4. Añada ruido Gaussiano a las imágenes de los ejercicios anteriores y repita los experimentos. Comente sobre el desempeño de estos detectores y sobre los valores de los parámetros.