• Posts recientes

    Obtener el Histograma de una imagen en Matlab [código]

    Para realizar el procesamiento digital de imágenes, una de las tareas básicas y de mucha utilidad para otras, es obtener y visualizar el histograma de una imagen a procesar. Matlab, en su toolbox, ofrece comandos que permiten visualizar este histograma, sin embargo, nosotros mismos podemos usar nuestro popio código para este fin.

    A continuación el código para obtener el histograma de una imagen en escala de grises:

    1. function hist=Histograma (imagen)
    2. im = imread(imagen);
    3. imD = double(im);
    4. [f,c]=size(imD);
    5. for i=1:256
    6. h(i) = 0;
    7. end
    8. for i=1:f
    9. for j=1:c
    10. k = imD(i,j);
    11. h(k+1) = h(k+1)+1;
    12. end
    13. end
    14. plot(h);
    15. hist = h;



    La entrada es una cadena de caracteres conteniendo la ruta de la imagen que deseamos procesar. por ejemplo, 'D:\proc\lena.tif', obteniendose el vector que contiene el histograma de dicha imagen y visualizándose mediante el comando plot. Luego tan solo queda hacer uso de la función de la siguiente manera: H=Histograma('D:\proc\lena.tif'); parara obtener nuestro propio histograma. En las siguientes imagenes, la famosa lena y el histograma resultante mediante el código presentado.



    Si se desea obtener el histograma de una imagen en espacio de colores RGB, entonces lo único que se tendría que agregar al código presentado es la obtención de un histograma por cada matriz componente R, G, B de la imagen.


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



    38 comentarios:

    1. si hablas de matlab imhist(I) ;) mucho mas rapido en tiempo y es solo un comando, claro en matlab.

      ResponderEliminar
    2. Si desean saber como normalizar el histograma pueden ver: normalización de un histograma.

      saludos

      ResponderEliminar
    3. Hola.

      Recomiendo inicializar el vector "h" evitando el bucle for en Matlab. Para el caso, mejor usar:

      h=zeros(1,256);

      Saludos.

      ResponderEliminar
    4. Que tal,
      Tienes un problema en el conteo de tus datos, pues que pasa si tienes un valor de 0 en el RGB, entonces k seria cero y te lanzaría un error pues Matlab no permite localidades con indice 0 en sus arreglos, entonces te recomendaría que cambiaras las siguientes lineas.

      h(k + 1) = h(k + 1) + 1;

      Saludos

      ResponderEliminar
    5. Buen aporte, gracias por el comentario,

      saludos

      ResponderEliminar
    6. Gracias por el aporte me sirvió mucho :3

      ResponderEliminar
    7. genialllll....me salvaste d euna pequeña prueba...saludos !!!!

      ResponderEliminar
    8. excelente aporte pero como seri si quiero obtener el histograma por cada color

      ResponderEliminar
    9. hola disculpa una pregunta como podria hacer un ciclo para que me leyera una imagen por partes de 5 por 5 pixeles, para toda la imagen y que me saque el histograma de cada parte lo estoy haciendo con este codigo:

      for i=1:256
      h(i) = 0;
      end
      for i=1:5
      for j=1:5
      k = im(i,j);
      h(k) = h(k)+1;
      end
      end

      mas o menos pero como le puedo hacer para que me los vaya incementando o sea que pase a los siguientes 5 pixeles les agradeceria cualquier aporte gracias...

      ResponderEliminar
      Respuestas
      1. Hola, en tu caso, lo que haria seria colocar, despúes del for de la linea 11, un par más de for a=1:5 y b=1:5, y dentro de eso aplicaría lo que sigue (que es lo que entiendo que estas solicitando).

        saludos

        Eliminar
      2. hola disculpa eso si lo hace lo que no hace es recorrer la matriz en submatrices de 5*5 pixeles ciando quiero que los recorra le sumo 5 y se lo suma al valor del pixel no recorre otras 5 posiciones no se que tengo mal no se como hacer el ciclo para que los recorra toda la imagen pero por partes no se si me entiendas y gracia valla que eres bueno para esto muchas gracias por todo

        Eliminar
      3. le puse el ciclo de esta manera
        if cuadro < size (im)
        for i<f
        a=i + 5
        for j<c
        b= j + 5
        end

        tratanndo de que cuando sea menor a el tamaño de la imagen incrementara solo que lea la imagen toda pero por partes...llevo horas y no se como hacerle se qu lleva un ciclo for pero no le puedo poner "menor a", porque me marca error??

        en cuadro tengo (im(1:5,1:5)) y si me saca el cuadro tengo la idea pero no le estoy estructurando bien

        Eliminar
    10. y parar cualquiel imagen como seria e codigo

      ResponderEliminar
      Respuestas
      1. a qué te refieres con para cualquier imagen? ...si te refieres a una imagen en espacio RGB, lo que normalmente se hace es crear un histograma para cada matriz R, G y B

        saludos

        Eliminar
    11. como puedo hacer que la grafica que obtengo de un histograma normalizado, sea suavizado la grafica y como debe de ser el codigo.

      ResponderEliminar
      Respuestas
      1. con suavizado te refieres a los bordes de la curva del histograma? si es asi entonces ya tendrías que entrar en detalles de los parámetros de la función plot que te ofrece Matlab,

        saludos

        Eliminar
      2. Jorge, tengo una pregunta... tengo ciertas imágenes en una carpeta y lo que quiero hacer es coger la primera imagen y compararla con la segunda, luego la segunda con la tercera y así sucesivamente... se que debo hacer un ciclo, pero como lo hago??
        Cada vez que comparo las imágenes hago unos cálculos.

        Eliminar
      3. Hola Sebastian, en esos casos lo que hago es renombrar las imagenes a analizar con nombres numéricos (1.bmp, 2.bmp, etc ), luego hacer una lectura iterativa en un bucle y hacer el procesamiento respectivo

        sds

        Eliminar
    12. hola! espero me puedas ayudar...
      como puedo hacer para contar la ocurrencia de tonalidades de gris en una imagen en blanco y negro?!

      gracias de antemano

      saludos ;D

      ResponderEliminar
      Respuestas
      1. Hola, si entendí bien tu pregunta, lo que estas buscando es justamente el código de un histograma, como el que se muestra en este post.

        sds

        Eliminar
    13. Hola una pregunta como podría hacer el histograma para RGB, me ayudarían mucho si me podrías mostrar como es el programa en matlab

      ResponderEliminar
      Respuestas
      1. Hola, el histograma para RGB sería este mismo código pero usado 3 veces, 1 para cada matriz R, G y B

        sds

        Eliminar
    14. Hola como estas te quiero pedir un favor por favor necesito escribir un programa en matlab para modificar un color dominante de una imagen y reemplazarlo por otro Sera que me puedes ayudar? Gracias de antemano

      ResponderEliminar
      Respuestas
      1. Tendrías que identificar el "color dominante" que asumo que sea, por ejemplo, un color que tenga un valor alto de ocurrencia. Una vez eso, solo sería asignarle un nuevo valor a todos los píxeles que tengan dicho valor.

        sds

        Eliminar
    15. Podrias escribir el codigo ya completo

      ResponderEliminar
      Respuestas
      1. El código está completo, o a que te refieres especificamente?

        Eliminar
    16. disculpa, hay términos de los cuales no es entendible a que se refieren, al correrlo en matlab marca errores y no se como corregirlo xq no entiendo algunos términos... podrías ayudarme????

      ResponderEliminar
    17. Hola, como puedo representar 4 histogramas en una sóla figura con la función plot.
      Gracias

      ResponderEliminar
    18. se podria seguir agregando codigo al que tu hiciste, para mostrar la mayor canticad de color claro
      una especie de sal y pimienta?, en que parte del codigo lo puedo agregar?

      ResponderEliminar
    19. Por que al aplicar la función imhist y este, el histograma no da igual?

      ResponderEliminar
    20. Como seria la ecualización del histograma en matlab?

      ResponderEliminar
    21. Como seria para el caso de querer obtener un histograma HSV?

      ResponderEliminar

    Related Posts Plugin for WordPress, Blogger...

    Post Top Ad