Mostrando entradas con la etiqueta Español. Mostrar todas las entradas
Mostrando entradas con la etiqueta Español. Mostrar todas las entradas

23 abril 2009

Ejemplo de extracción de bits de una imagen en escala de grises de 8 bits en MATLAB

En este caso supongamos que tenemos una imagen en formato PGM, (escala de grises de 256 niveles, o sea 8 bits). Si queremos extraer la información de cada bit entonces tenemos lo siguiente:

  • u, es el valor del pixel al que le vamos a extraer el bit
  • B, es el número de bits usado para representar un pixel
  • n, es el bit que queremos extraer de cada pixel, B es el menos significativo y 1 es el más significativo
  • L, es en nivel máximo que puede tener nuestra imagen

Según Anil K. Jain en su libro Fundamentals of Digital Image Processing, en el capítulo dedicado al mejoramiento de imágenes (o image enhancement), explica la extracción de bits en una imagen y define al pixel u de la siguiente manera: 

u, nuestro pixel original

y queremos que nuestro pixel resultado v de la extracción de bit sea:

v

El autor define kn como se muestra a continuación: kn

En donde:

in

En  este caso u puede tomar valores entre 0 y 255 (ya que es una imagen PGM de 8 bits). Por ejemplo si decimos que u = 237 y queremos extraer el bit más significativo entonces tenemos que n = 8  y B = 8. Representando u en su equivalente binario tendriamos que u = 11101101. Nos quedaría de la siguiente manera:

    1. in = i8 = int[237/(2^8-8)] = 237
    2. in-1 = i7 = int[237/(2^8-7)] = int[237/2^1] = int[237/2] = int[118.5] = 118
    3. kn = k8 = 237 – 2*118 = 237 – 236 = 1

Enseguida se muestra el codigo en MATLAB para llevar a cabo la extracción de bits de la imagen del bote:

clc;clear;
myImagen = imread('boat.pgm');
myImagenNueva = myImagen;
[rows cols] = size(myImagen);

B = 8;
L = 255;

for n = 1:B
    for i = 1 : rows
        for j = 1 : cols 
            u = double(myImagen(i,j));
            iEne = floor(u/2^(B-n));
            iEneMenosUno = floor(u/2^(B-(n-1)));
            BitExtraido = iEne - (2*iEneMenosUno);
            if BitExtraido == 1
                BitExtraido = L;
            else
                BitExtraido = 0;
            end
            myImagenNueva(i,j) = BitExtraido;
        end
    end
    subplot(2,4,n);
    imshow(myImagenNueva);
    title(['Bit', num2str(n)]);
end



EjemploExtracionDeBitsMATLAB

25 febrero 2009

¿Qué tan gacha se ve la foto matemáticamente hablando? Parámetros para medir el desempeño de un algoritmo de compresión de datos con pérdidas

En la compresión de datos, lo que se busca presisamente es comprimir, valga la redundancia (y no es chiste), o sea, reducir en tamaño los datos originales, y esto es principalmente con dos fines: almacenamiento y transmisión. Existen dos tipos de compresión usados comúnmente:

  1. Con pérdidas (Loosy): Se refiere a los algoritmos que comprimen los datos, pero que al recuperarlos no se tiene la información original, sino un aproximado, todo se basa en la subjetividad.
  2. Sin pérdidas (Lossless): Como su nombre lo indica, se reduce el número de datos para representar la información, pero al recuperarse se reproduce tal como la original.

Usualmente, el primero ofrece una compresión mayor en comparación con el otro, y esto es de una manera obvio, debido a que al ser un algoritmo que permite pérdidas, entonces es menor la cantidad de información necesaria.

Una de las medidas más usadas en imágenes y audio es el promedio de errores cuadrados (MSE: mean square error):

MSE

Ahora, si queremos el error relativo a la señal se calcula el error de la señal reconstruida y el MSE, y a esta relación se le llama relación de señal a ruido (SNR: Signal to Noise Ratio) y esta dada por:

SNR

El SNR se mide comúnmente en escala logarítmica, en decibeles (dB) y se representa cómo:

SNR(DB) 

Hay veces que es necesario conocer el error relativo al valor máximo, o valor pico de la señal, y a esto se le llama Razón de la Señal Pico al Ruido (PSNR: Peak Signal to Noise Ratio) y se calcula de la siguiente manera:

PSNR(dB)

Existen otras medidas que se emplean para medir la distorción de manera frecuente, un ejemplo usado para evaluar algoritmos de compresion de imágenes es el del promedio de diferencias absolutas:

Promedio de las diferencias absolutas

Cuando la distorción es imperceptible entonces se calcula el valor de la magnitud del error:

Valor maximo de la magnitud del error

Los parámetros mencionados en este post, son como ya se mencionó, para medir el desempeño de los algoritmos de compresión, y una pregunta que me hice al empezar a estudiar esto, ¿y qué demonios me dice esto o para que me sirve? A, pues medio simple, son números que nos sirven para determinar que tan “fiel” a la original esta la señal y se usan estos números para tomar un tipo de decisión o llegar a una conclusión en cuanto al algoritmo utilizado.

¿Capish?

24 febrero 2009

¿Cómo demonios se supone que debo interpretar esto? Cuantización escalar uniforme de una imagen en MATLAB

Una parte fundamental del procesamiento digital de imágenes, es la representación de una imagen. De manera muy general, si vemos una imagen como parte de un sistema de adquisición de datos, el sensor es el que se encarga de capturar el brillo de la luz y convertirla a valores que puedan ser usados digitalmente, es nuestro convertidor análogo a digital. De acuerdo a lo que establece Sonka, Hlavac y Boyle en Image Processing, Analysis, and Machine Vision (Ed. Thompson, 2008, USA), la transición entre los valores continuos de la función de la  imagen (brillo) y sus equivalentes en el mundo digital se le llama cuantización, y el número de niveles de cuantización debe ser lo suficientemente grande como para permitir que el ser humano perciba los detalles finos del sombreado en la imagen. 

En este ejemplo vamos a trabajar con una imagen PGM, que al leerla en MATLAB nos regresa una matriz de tamaño NxM. Cada elemento representa un pixel en la imagen, con valores que van de 0 a 255, es decir 256 valores diferentes (8bits). A esta imagen también le podemos aplicar una cuantización ya que con menos bits es posible representar la imagen, con pérdidas debido a que son menos niveles de grises disponibles para mostrar la imagen.

  1. %Lee imagene PGM
  2. imagen = double(imread('peppers.pgm'));
  3. %Crea variables temporales
  4. imgQuantized = zeros(512,512);
  5. imgQuantizedToDisplay = zeros(512,512);
  6. n = 2; %Define bits para cuantización
  7. figure();
  8. imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar
  9. imgQuantizedToDisplay = ((imgQuantized)*(256/2^n));
  10. imshow(uint8(imgQuantizedToDisplay));
  11. title(['Cuantización a ', num2str(n) ,' bits']);
  12. n = 4; %Define bits para cuantización
  13. figure();
  14. imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar
  15. imgQuantizedToDisplay = ((imgQuantized)*(256/2^n));
  16. imshow(uint8(imgQuantizedToDisplay));
  17. title(['Cuantización a ', num2str(n) ,' bits']);
  18. n = 6; %Define bits para cuantización
  19. figure();
  20. imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar
  21. imgQuantizedToDisplay = ((imgQuantized)*(256/2^n));
  22. imshow(uint8(imgQuantizedToDisplay));
  23. title(['Cuantización a ', num2str(n) ,' bits']);
Tarea4_Compresion_ParaBLOG_01 


Tarea4_Compresion_ParaBLOG_02



Tarea4_Compresion_ParaBLOG_03



 



Con n=2 bits podemos representar 2^n=2^2=4 niveles distintos de grises. Así mismo, con n=4 bits podemos representar 2^n=2^4= 16 niveles y con n=6 bits se representan 2^n=2^6=64 niveles en escala de grises.

23 febrero 2009

El impacto de una revelación inesperada

¿A poco no cambian las cosas cuando en el momento menos esperado descubres de una u otra manera algo que por algún tiempo había vagado sin rumbo aparente por los pasillos del inconsciente? Siempre sucede de la misma manera. Al estar buscando  respuestas a los grandes enigmas universales, uno se encuentra en el mundo de las tinieblas ya que la claridad nunca llega en el momento indicado y más aún, siempre surgen dudas adicionales en el camino. Pero, también todo es diferente cuando en un solo instante las cosas parecen aclararse, no me refiero a resolver los enigmas, sino que a raíz de dicha epifanía uno cree comprender el porqué de las cosas, tampoco significa que tienes que estar de acuerdo con ellas…, pero así sucede, desgraciadamente .

Si tenemos una imagen en formato PGM, que según sus autores “está designado para ser extremadamente fácil de aprender”, ya que cada uno de los valores de los datos representa un pixel en escala de grises de 8 bits, no representa en mayor problema hacer un programa para obtener la imagen del archivo. Afortunadamente no es este el caso, en MATLAB leemos un archivo pgm de la siguiente manera:

imagen = imread('peppers.pgm','pgm');

Ahora, imagen es una variable que contiene una matriz de MxN pixeles, donde N y M dependen del tamaño de la imagen. A esto lo vemos como nuestra señal, y le aplicamos la Transformada de Fourier Discreta, pero al ser una imagen y como lo mencionaba antes, es una matriz de 2 dimensiones, lo que quiere decir que tenemos que realizar la transformada a través de los renglones y después de las columnas. El código que se presenta a continuación fue sacado de aquí, aunque lo modifique ligeramente para solamente pasarle los datos y calcular automáticamente el tiempo y las frecuencias a partir de esto, lo que realiza esta función es calcular la DFT a los datos de entrada:

  1. function X=dft(x)
  2. [sx1 sx2] =size(x); %Obtener el tamaño de la matriz
  3. t = [0:sx2-1];     %Calcular la base de tiempo
  4. f = [0:(1/sx2):(1-(1/sx2))];    %Calcular las frecuencias
  5. t = t(:); % Formatear 't' en vector columna
  6. x = x(:); % Formatear 'x' en vector columna
  7. f = f(:); % Formatear 'f' en vector columna
  8. W = exp(-2*pi*j * f*t');
  9. X = W * double(x);

Código 1. Función que realiza la DFT en MATLAB

Las últimas dos líneas de código representan en esencia la transformada de fourier. Tengo que hacer referencia al post que escribí iniciando este tema, ya que no recuerdo de que fuente tomé la ecuación en el post anterior, pero noto que es diferente en cuanto X(k)  y x(n) está representadas como X(k+1) y x(n+1), creo que la diferencia radica en donde se tomen los coeficientes.

Ok, otra vez, la ecuación siguiente nos muestra la transformada de fourier discreta (Tomada de: Practical Digital Signal Processing for Engineers and Technicians, pp 63)

DFTEcuación 1

Ahora, viendo el programa relacionamos la línea 8 con lo siguiente:

w   Ecuación 2

Podemos observar de la ecuación anterior que k es el equivalente a la líneas 3 y  n/N es la línea 4. Esto es, k es el ‘tiempo’ o mas bien dicho cada muestra en la imagen  y las frecuencias en las que contienen son n/N. (Si, esto me sigue causando problemas emocionales todavía). En la última línea del código anterior (la nueve) tenemos las muestras x(n) con los componentes de frecuencia (lo representado en la ecuación 2).

  1. imagen = imread('peppers.pgm','pgm');
  2. imfinfo('peppers.pgm')
  3. figure(1); imshow(imagen);
  4. [s1 s2]= size(imagen);
  5. dftimagen = zeros(s1);
  6. for i=1:s2
  7.     dftimagen(i,:) = dft(imagen(i,:));
  8. end
  9. dftimagen= dftimagen.';
  10. for i=1:s2
  11.     dftimagen(i,:) = dft(dftimagen(i,:));
  12. end
  13. dftimagen = dftimagen.';
  14. figure(2);imshow(uint8(ifft2(dftimagen)));
Código 2. Programa que realiza la DFT a una imagen de 8 bits escala de grises en MATLAB

De las líneas 1 a la 3 se lee la imagen y muestra en pantalla, en las líneas 4 y 5 se crea una nueva variable para almacenar el resultado de la transformada (este código tiene el inconveniente que da por hecho que es una matriz cuadrada).  Las líneas 6 a 8 realizan la DFT a cada renglón de la imagen, posteriormente se realiza una traspuesta (en la línea 9) a la imagen para realizar la DFT a lo largo de las columnas en las lineas 10 a 12 y se regresa con la traspuesta de la línea 13.

Por último, se toma la variable que tiene almacenada la imagen transformada y usando la transformada inversa que viene incluida en MATLAB se recupera la imagen original y se muestra en pantalla (línea 14) para verificar que se halla realizado correctamente la DFT.

Solo para terminar esta imagen en la que hice pruebas es una imagen de 512 x 512 pixeles y es bastante lento, no tengo los datos de cuanto se tarda, pero no se compara con la función que trae integrada MATLAB para realizar la FFT (no de en vano se llama Fast Fourier Transform, claro)

Isn’t ironic? Don’t you think?

20 febrero 2009

Blogger, Windows Live Writer, Windows, y demás chinches no son amigables para escribir textos matemáticos o cómo la lógica del diseño del software e interfaz de usuario frustran cualquier intento de poner ideas claras en la red

Al empezar a escribir mis intentos de explicaciones, he estado de una manera u otra tratando de evitar el uso del editor de ecuaciones de Micro$oft, y recordando aquellos días en los que más de una vez me di de topes por no poder escribir una integral en alguna tarea o reporte, divagando sobre eso, me acordé de usar LaTEX (no, no tiene nada que ver con la planificación familiar o la prevención de ETS) para escribir ecuaciones matemáticas y en general texto con buen formato desde su redacción.

Haciendo uso de San Google, fui a parar con un par de herramientas para insertar código de LaTEX en blogger, pero oh sorprais, es un real dolor de cabeza el tratar de poner más de cinco ecuaciones, y más aún, una vez que las pusiste, se ven horribles, porque lo único que se hace es instalar un pequeño jscript en blogger y mediante un botón, conviertes el código de LaTEX en imágenes que quedan almacenadas en agún lugar del ciberespeis, así que no se integran naturalmente en el texto como en un documento .tex,  si no que se ven como imágenes sin ningun tipo de orden dentro del párrafo.

Si eso no es suficiente, lo tienes que hacer con Firefox y Greasemonkey en una de las opciones que encontré o simplemente con un pequeño código en HTML que la verdad en este momento no quiero ni explicar, así es que o te amarran a FF y GM (no es que sean malos pero a mi opinión Chrome está ganando terreno) o lo haces con HTML, lo cual se convierte en un problema al querer usar el Windows Live Writer, que no está del todo mal, de hecho es lo que he usado para redactar los posts, pero igual para darle formato a las ecuaciónes termina en un lío y también los convierte a imágenes, que en este caso ni siquiera se ponen en línea con el texto, si no que agrega un salto de línea antes y despues de la ecuación.

Y sólo para concluir, – así es corazón de mi vida, siempre has tenido razón, ‘inches ingenieretes no somos nada prácticos

PD. Cuando edité el post porque me equivoqué en algunas cosas en el título, me dí cuenta que desde blogger no podía editar el título del post debido a la longitud del texto, así que tuve que entrar al windows live writer para modificarlo (adivinaron, WLW todavía no tiene corrector ortográfico, ni falta que hace, jeje)…

19 febrero 2009

Necesito lo que fumaba Fourier…

Definitivamente no alcanzo a comprender la Transformada de Fourier Discreta, y mis problemas se elevan al cuadrado cuando quiero comprenderla aplicada a una imagen, já!

Como el Sr. Marley solía decir…

18 febrero 2009

La temible Transformada de Fourier Discreta (aka: DFT)

¿Por qué nos puede llegar a importar la transformada de Fourier Discreta?

Voy a empezar hablando de las aplicaciones dadas a la DFT, como lo dice Gonzalez en su libro de procesamiento de imagenes, aparte de ser la piedra angular en los filtros lineales, ofrece una considerable flexibilidad  en el diseño e implementación de soluciones de filtrado para compresión de imágenes, restauración de imágenes, mejora de imágenes, así como otras aplicaciones de igual interés. Ahora si, esto es suficiente para darnos ánimos y conocer la DFT a fondo. (Si, ajá)

Por definición, la DFT se representa de la siguiente manera:

DFT Ecuation 1

Mmmm, y como se puede observar claramente en la ecuación anterior, (jeje, no!, ya en serio) tenemos que:

  • X(k) = Es la transformada de fourier discreta de nuestra señal, es decir su representación en el dominio de la frecuencia.
  • x(n) = Es nuestra señal en el dominio espacial, por ejemplo una señal de audio

Así es que si vemos detenidamente, cada muestra X(k) será la sumatoria de la multiplicación de todos los valores de la señal de entrada por los componentes de frecuencia de la señal. Si, es esa e elevada a la dos pi sobre N multiplicada por menos i multiplicada por k multiplicada por n.

Sin meternos en tanto rollo de medición de eficiencia de algoritmos podemos ver (tal vez no tan claramente) que mientras más muestras tenga nuestra señal, pues la cantidad de multiplicaciones y sumas se eleva exponencialmente, esto es un problema que se resolvió con la FFT, pero eso es harina de otro costal por ahorita.

Aquí le dejo con esta pequeña explicación de la DFT, pero continuaré con un ejemplo de ésta, codificada en MATLAB en un post futuro.

(Hasta ahorita sigo sin entenderle).

PD: Feliz cumpleaños Tris!!!

Inicio

A Ivonne

Cuando es tiempo de iniciar.

La creación este blog tiene como objetivo el compartir ideas, trabajos, tareas, artículos, eventos, links y cualquier cosa relacionada con el desarrollo de mi tesis para la Maestría en Ciencias en Ingeniería Eléctrica en la Universidad Autónoma de Ciudad Juárez. Esto, con la finalidad de hacer disponible de manera global el conocimiento que se pueda generar en algún momento y también crear un punto de discusión con los temas de interés relacionados con el procesamiento digital de imágenes.

La idea principal de la tesis se basa en la transformada Wavelet. La función principal de una transformada en el mundo del procesamiento de señales, es cambiar de dominio una señal, esto es, representar de manera “diferente” (para llamarle de alguna manera) una señal, para así poder observar características que en el dominio original son imperceptibles. Hay una buena cantidad de transformadas existentes, entre las cuales se encuentra la Transformada de Fourier, la de Coseno Discreta, la Wavelet, la Contourlet, etc.

Así es que basados en el hecho de que mediante una transformación de dominio se puede lograr un acercamiento alterno al análisis de una señal, comparado con la representación en el dominio original; se pretende hacer una caracterización de imágenes, (ya que una imagen es una señal en 2D) en el dominio transformado, usando en este caso una transformada Wavelet y llegar a obtener de manera sistemática información que pueda ser usada en los diferentes campos del procesamiento digital de imágenes, como por ejemplo el reconocimiento de patrones.

Este blog nace como respuesta a la necesidad de poner en claro las ideas que van saliendo en el camino de la realización del proyecto de tesis, aunque el enfoque de este blog es de carácter académico, claro que no puede ser limitado solamente a ello. Quiero agradecer infinitamente al amor de mi vida que me a apoya en absolutamente todo y sin su aliento no me hubiera animado siquiera a iniciar este Blog.

This is I

Blog dedicado a escribir sobre Sistemas Embebidos y el Internet de las Cosas o IoT que le llaman.