Búscalo aquí:

Reflejar los píxeles de una Imagen [código]

Como ya es conocido, una imagen es representado como una matriz numérica, donde cada elemento de dicha matriz representa un píxel de la imagen. De la misma manera, una de las tareas más comunes en el procesamiento de imágenes es el de convolucionar dicha matriz para conseguir un determinado objetivo.


La convolución de una matriz que representa una imagen indica que se debe de multiplicar una pequeña sub-matriz (rejilla) de una determinada dimensión (menor a la dimensión de la imagen original) formada a partir de un píxel de referencia, por una matriz especial llamada matriz de convolución (una matriz de filtro gaussiano, por ejemplo).

Si bien es cierto, esta tarea es sencilla y es simple de implementar en el código de un programa, existe un problema al que siempre nos veremos enfrentados, este es: ¿cómo generar la sub-matriz de la imagen a partir de un píxel de referencia que se encuentra en los extremos de la imagen (píxeles limitantes)?.

Es, decir, por ejemplo, si necesitamos crear una sub-matriz de dimensión 10 x 10 píxeles tomando como referencia el primer píxel de la imagen (posición (1,1)), deberíamos tomar 5 píxeles a la izquierda, 5 píxeles a la derecha, 5 pixeles hacia arriba y 5 píxeles hacia abajo, del píxel de referencia. Pero dado a que tomamos el de la posición (1,1), no tenemos píxeles a la iquierda ni hacia arriba, lo que siginificará que tendremos problemas en la compilación por acceso a índices no existentes.

Para solucionar esto, se usa la reflexión de matrices. Para esto tomamos un determinado valor de radio (en el ejemplo anterior el radio sería 5). Con este radio lo que hacemos es agrandar la matriz de la imagen original, agregando a los extremos (superior,inferior,izquierdo y derecho) una banda más de píxeles (con la cantidad de radio necesitada). Así, podemos realizar la tarea de convolución sin preocuparnos por acceso a índices incorrectos.

El código en matlab de la reflexión de píxeles de imágenes es el siguiente:

  1. %author: Jorge Valverde Rebaza
  2. function M = RefMatriz(imagen,radio)
  3. im=imread(imagen);
  4. imD = double(im);
  5. imaux = imD;
  6. M = imD;
  7. [f,c] = size(imagen);
  8. %primero reflejamos las filas superiores
  9. for i=1 : radio
  10. F = imaux(i,:);
  11. M = [F;M];%le agrego una fila mas
  12. end
  13. %reflejamos las filas inferiores
  14. cont = 0;
  15. i = f;
  16. while cont<radio %iremos retrocediendo
  17. F = imaux(i,:);
  18. M = [M;F];
  19. cont = cont+1;
  20. i = i-1;
  21. end
  22. imaux = M; %ahora actualizamos la matriz auxiliar
  23. %ahora reflejamos las columnas
  24. for i=1 : radio
  25. C = imaux(:,i);
  26. M = [C M];
  27. end
  28. cont = 0;
  29. i = c;
  30. while cont<radio
  31. C = imaux(:,i);
  32. M = [M C];
  33. cont = cont+1;
  34. i = i-1;
  35. end

Los resultados de ejecutar este código con la imagen de lena y usando un radio de tamaño 30 píxeles, se pueden observar en la siguiente figura:



Además, como se podrán haber dado cuenta, la imagen reflejada tendrá una mayor dimensión que la original debido a que se le agregaron bandas de píxeles en sus extremos.

En la siguiente imagen se ha marcado con una elipse de color rojo aquellas zonas en las que se a realizado el reflejo de píxeles.



Espero les sea de utilidad, saludos.


Quieres leer más post como éste???...suscribete aquí!!!



9 comentarios:

  1. Esto era justo lo que estaba intentando hacer pero al momento de ejecutar mi programa obtenia unos errores en acceso a indices no existentes :(

    pero tu codigo calza perfecto :D, gracias

    ResponderEliminar
  2. Muchas gracias por compartir tus codigos, estaba intentando probar el Borde de prewitt el cual necesita este codigo y me sale el siguiente error
    ??? Error using ==> vertcat
    CAT arguments dimensions are not consistent.

    Error in ==> BordePrewitt>RefMatriz at 33
    M = [F;M;2]; %le agrego una fila mas

    Error in ==> BordePrewitt at 6
    matriz = RefMatriz(imD,radio);

    dice que las dimensiones son inconsistentes
    estoy probando con una imagen de 312x452x3
    cuando lo hago con una imagen de 159x159
    No me sale el error.
    si podrías ayudarme te lo agredeceria mucho

    ResponderEliminar
  3. especificamente el error es en esta fila de cada for M = [F;M]; %le agrego una fila mas
    no se si tiene q ver las dimensiones de la imagen

    ResponderEliminar
  4. he aquí la solución, agregue un parametro "dim" de dimensión por si solo quieres que se realizar el procedimiento en algun canal de un espacio de colores (Ejm: R=1 , G=2 , B=3)

    function M = RefMatriz(imagen,radio,dim)
    im=imagen(:,:,dim);
    imD = double(im);
    imaux = im;
    M = imD;
    [f,c] = size(im);
    %primero reflejamos las filas superiores
    for i=1 : radio
    F = imaux(i,:);
    M = [F;M];%le agrego una fila mas
    end
    %reflejamos las filas inferiores
    cont = 1;
    i = f;
    while cont<radio %iremos retrocediendo
    F = imaux(i,:);
    M = [M;F];
    cont = cont+1;
    i = i-1;
    end
    imaux = M; %ahora actualizamos la matriz auxiliar
    %ahora reflejamos las columnas
    for i=1 : radio
    C = imaux(:,i);
    M = [C M];
    end
    cont = 1;
    i = c;
    while cont<radio
    C = imaux(:,i);
    M = [M C];
    cont = cont+1;
    i = i-1;
    end

    ResponderEliminar
  5. hola soy nueva en esto;
    este código me marca este error:
    Input argument "imagen" is undefined.

    Error in ==> RefMatriz at 2
    im=imread(imagen);

    >> me puedes ayudar.....saludos
    >>

    ResponderEliminar
    Respuestas
    1. hola, se supone que eso es un parámetro, es decir, ahi tienes que colocar la ruta de la imagen que quieres procesar,

      sds

      Eliminar
    2. am osea que debo de cambiar todas las palabras imagen por la ruta?

      Eliminar
  6. hola, he intentado ejecutar sus codigos(sobel, kirsh) pero me sale un error en:
    M = [F;M];%le agrego una fila mas.
    tambien agregué el parametro Dim y no me dió,si me pueden ayudar con eso se los agradezco

    ResponderEliminar
  7. Cambiar [f,c] = size(imagen);
    por [f,c] = size(im);

    ResponderEliminar

Bienvenido a jcGeorge's Blog!!!

Por favor deja tu comentario, consulta o sugerencia, procura mantener habilitado tu perfil de Blogger o deja un enlace a tu blog o web.

Gracias por leer este blog!!!

Related Posts Plugin for WordPress, Blogger...