<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3919270335168988083</id><updated>2012-01-01T18:10:05.390-07:00</updated><category term='wavelets'/><category term='uacj'/><category term='Extracción de bits'/><category term='MSE'/><category term='visión computacional'/><category term='English'/><category term='Zoundry Raven'/><category term='GUIDE'/><category term='tutorial basico de GUIDE en MATLAB'/><category term='RLE'/><category term='Complicaciones'/><category term='Español'/><category term='Filtros'/><category term='Quantization'/><category term='México Lee 2009'/><category term='wavelet'/><category term='Extraccion de Bits'/><category term='wavedemo'/><category term='Procesamiento digital de imágenes'/><category term='Software para publicar en blogs'/><category term='freqz'/><category term='visión por computadora'/><category term='PSNR'/><category term='Cuantización'/><category term='frames'/><category term='MATLAB'/><category term='Premio Nacional de Fomento a la Lectura'/><category term='Infestación'/><category term='FFT'/><category term='Complications'/><category term='656 Comics'/><category term='Compresión Diferencial'/><category term='PGM'/><category term='Fourier'/><category term='zplane'/><category term='LabVIEW'/><category term='The Mythology'/><category term='DPCM'/><category term='SNR'/><category term='Procesamiento de imágenes con LabVIEW'/><category term='Ideas'/><category term='Compresión de Datos'/><category term='Procesamiento digital de imagenes'/><category term='DFT'/><category term='Blog  publishing'/><category term='Tratamiento digital de imágenes'/><category term='FIR'/><title type='text'>Procesamiento Digital de Imágenes</title><subtitle type='html'>Intento de blog para hablar sobre temas de Procesamiento Digital de Imágenes</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-5880143611092040032</id><published>2011-07-28T10:26:00.001-06:00</published><updated>2011-07-28T10:26:43.063-06:00</updated><title type='text'>Algoritmo de detección de iluminación defectuosa en indicadores de paneles de instrumentación – Parte I (Teoría)</title><content type='html'>&lt;h4&gt;&amp;nbsp;&lt;/h4&gt; &lt;p&gt;El Presente proyecto fue realizado en Mayo del 2009 como proyecto final para una materia de Procesamiento Digital de Imágenes en la Maestría en Ciencias en Ingeniería Eléctrica en la Universidad Autónoma de Ciudad Juárez (UACJ).&lt;/p&gt; &lt;p&gt;&lt;a name="_Toc231206847"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h4&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;&lt;a name="_Toc231205602"&gt;Definición del Problema&lt;/a&gt;&lt;/h4&gt; &lt;p&gt;En una empresa donde se manufacturan componentes electrónicos para la industria de la transportación se tiene un indicador analógico usado en camiones pesados y casas rodantes. Este indicador cuenta con iluminación de fondo, como es común en los vehículos automotrices para poder leer el indicador en condiciones de poca luz.&lt;/p&gt; &lt;p&gt;La iluminación esta dada por tres diodos emisores de luz (LED: &lt;i&gt;Light Emisor Diode&lt;/i&gt;) ensamblados en la tablilla electrónica (PCB: &lt;i&gt;Printed Circuit Board&lt;/i&gt;), la luz se distribuye por medio de un reflector plástico y se proyecta en la pantalla que contiene la graduación para la que esta diseñado. En la figura 1 se muestra un bosquejo de la posición de los LEDs en el objeto bajo prueba, aquí se muestra sin la pantalla para poder mostrar la localización de los emisores de luz. En la figura 2 se muestra una vista lateral para indicar de manera general la construcción del objeto bajo prueba en la parte de iluminación.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-3DQA33Tlu3I/TjGMeTeAMBI/AAAAAAAAAiw/Bo_tiWRSZ88/s1600-h/clip_image001%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image001" border="0" alt="clip_image001" src="http://lh4.ggpht.com/-p9JOgUrpEps/TjGMfzt7q6I/AAAAAAAAAi0/jO7nnig_5S0/clip_image001_thumb.gif?imgmax=800" width="348" height="333"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 1. Vista superior del objeto bajo prueba&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-BfWML0Fd17I/TjGMgcPNUYI/AAAAAAAAAi4/Z9fVAYNb1K8/s1600-h/clip_image002%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/-UvP_-W-0hCQ/TjGMnHr9PZI/AAAAAAAAAi8/6WElM5pRBQ0/clip_image002_thumb.gif?imgmax=800" width="357" height="90"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 2. Vista lateral del objeto bajo prueba&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;El problema se presenta cuando uno o más de los indicadores no encienden por alguna razón, esto es algo común en una ambiente de producción en serie, es por eso que se cuenta con un equipo de prueba funcional, el cual tiene la necesidad de detectar este tipo de defectos. Por ejemplo un objeto defectuoso es cuando uno de los Led mostrados en la figura 1 no prende o no esta presente. No es una tarea trivial detectarlos en con un sistema de visión, debido que el objeto bajo prueba tiene la pantalla que sirve para difuminar la luz junto con el reflector y no es fácil determinar cuales son las características necesarias para discriminar un objeto bueno de uno defectuoso.&lt;/p&gt; &lt;h4&gt;&lt;a name="_Toc231206848"&gt;&lt;/a&gt;&lt;a name="_Toc231205652"&gt;&lt;/a&gt;&lt;a name="_Toc231205624"&gt;&lt;/a&gt;&lt;a name="_Toc231205603"&gt;Desarrollo.&lt;/a&gt;&lt;/h4&gt; &lt;p&gt;Se cuenta actualmente en la línea de producción con un equipo de prueba funcional, con un sistema de visión, con el cual se ejercita el indicador tal y como si estuviera instalado en el vehiculo y se verifica que sea funcional. El objetivo del presente proyecto es para agregar la funcionalidad de que revise cuando uno de los emisores de luz esta faltante o no enciende.&lt;/p&gt; &lt;p&gt;El equipo consta de una computadora personal para adquirir la imagen, hacer el procesamiento y controlar los instrumentos del equipo. Cuenta con una cámara industrial de 1.3 megapíxeles con interfase USB. El objeto bajo prueba y la cámara se encuentran en un gabinete cerrado para minimizar el efecto de la iluminación a causa de la variación en la iluminación externa. A continuación se presenta en la figura 3 un dibujo básico de los componentes del sistema de visión. En este no se incluye todo lo relacionado con el control del mecanismo y la alimentación del objeto bajo prueba.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-bpho8BZ7uDU/TjGMnpS6QaI/AAAAAAAAAjA/IOHc6mQySIQ/s1600-h/clip_image003%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image003" border="0" alt="clip_image003" src="http://lh3.ggpht.com/-5E0KQ0Tq0Jk/TjGMoJL1jQI/AAAAAAAAAjE/5cL8ebAF7ds/clip_image003_thumb.gif?imgmax=800" width="352" height="251"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 3. Diagrama básico del sistema de visión&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;En la figuras 4 y 5 se muestran ejemplos de objetos reales tomados con el sistema de visión descrito en el párrafo anterior. Se muestran ejemplos de dos tipos de indicadores, los cuales podemos separar en dos tipos, unos con fondo blanco y otros con fondo negro. Al ser diferentes los fondos el tipos de características en cada imagen es totalmente diferente, es uno de los objetivos de este trabajo el definir características en común para ser usadas como límites de pasa o falla.&lt;/p&gt; &lt;p&gt;En la figura 4 se muestran los indicadores con fondo blanco, la primera imagen muestra como se ve cuando una pieza esta correcta y los incisos restantes muestran los tipos de casos cuando faltan los emisores de luz del 1 al 3. En la figura 5 se muestran los mismos tipos de ejemplos pero en este caso para los indicadores con fondo negro.&lt;/p&gt; &lt;p&gt;Para realizar el procesamiento de las imágenes se usará el software MATLAB versión 7.0.0.19920 (R14) y el Toolkit de procesamiento digital de imágenes. El formato de la imagen a utilizar en este ejemplo es el formato PGM&lt;a name="_ftnref1_8415" href="#_ftn1_8415"&gt;[1]&lt;/a&gt; (&lt;i&gt;Portable GrayMap&lt;/i&gt;). Al leer la imagen con MATLAB se obtiene una matriz bidimensional de tipo uint8 y las dimensiones son definidas por el tamaño de la imagen, ya que cada píxel es representado por un byte de la matriz, con valores de 0 a 255 en escala de grises.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-yco8dLAYsVc/TjGMozUmHMI/AAAAAAAAAjI/xoGzsu5N600/s1600-h/clip_image005%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image005" border="0" alt="clip_image005" src="http://lh4.ggpht.com/-klvYJwWgQfs/TjGMpRTVXyI/AAAAAAAAAjM/LlvTYv7BG8I/clip_image005_thumb.jpg?imgmax=800" width="576" height="180"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 4.Ejemplo de indicadores con fondo blanco&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;b&gt;a) &lt;/b&gt;&lt;b&gt;LEDs correctos b) LED 1 Defectuoso c) LED 2 Defectuoso d) LED 3 Defectuoso&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-DTOpZgLkc9Y/TjGMqOeofkI/AAAAAAAAAjQ/88k98_fydSE/s1600-h/clip_image007%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image007" border="0" alt="clip_image007" src="http://lh3.ggpht.com/-6Buc0FEt2eU/TjGMq6WKHwI/AAAAAAAAAjU/aY_od24__sM/clip_image007_thumb.jpg?imgmax=800" width="576" height="180"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 5. Ejemplo de indicadores con fondo negro&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;b&gt;a) &lt;/b&gt;&lt;b&gt;LEDs correctos b) LED 1 Defectuoso c) LED 2 Defectuoso d) LED 3 Defectuoso&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;Se utilizó la siguiente metodología para resolver el problema. Para poder resaltar las características de la imagen, se hicieron pruebas con varias técnicas de mejoramiento de imagen y también se le aplicaron diferentes técnicas de segmentación para resaltar dichas características que nos ayuden a determinar un parámetro confiable de segregación.&lt;/p&gt; &lt;p&gt;El método de extracción de bits se aplicó a las imágenes con el fin de segmentar la imagen y obtener una imagen binarizada como resultado. Anil K. Jain&lt;a name="_ftnref2_8415" href="#_ftn2_8415"&gt;[2]&lt;/a&gt; explica la extracción de bits en una imagen y define al píxel &lt;b&gt;&lt;i&gt;u&lt;/i&gt;&lt;/b&gt; de la siguiente manera:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-gwJS018Yfj4/TjGMsJPZzCI/AAAAAAAAAjY/hYA5SzFX_W0/s1600-h/clip_image009%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image009" border="0" alt="clip_image009" src="http://lh4.ggpht.com/-Zw6RhuIy_rs/TjGMs7prHbI/AAAAAAAAAjc/ercaQHWIxR0/clip_image009_thumb.jpg?imgmax=800" width="408" height="33"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Y se requiere que nuestro píxel resultado &lt;b&gt;&lt;i&gt;v&lt;/i&gt;&lt;/b&gt; de la extracción de bit sea:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-POShZT60REw/TjGMtrVMAUI/AAAAAAAAAjg/tX2PFaAd58g/s1600-h/clip_image011%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image011" border="0" alt="clip_image011" src="http://lh5.ggpht.com/-9U_gJfbrKIE/TjGMwgaNyDI/AAAAAAAAAjk/_xv34avaGgg/clip_image011_thumb.jpg?imgmax=800" width="230" height="74"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El autor define &lt;b&gt;&lt;i&gt;kn&lt;/i&gt;&lt;/b&gt; como se muestra a continuación:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-8yQqQxnSxUc/TjGM26HPQDI/AAAAAAAAAjo/wy7Cy1Uh-cA/s1600-h/clip_image013%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image013" border="0" alt="clip_image013" src="http://lh4.ggpht.com/-MzzIWrtxvXc/TjGM3m344hI/AAAAAAAAAjs/8kyKYGAjkyM/clip_image013_thumb.jpg?imgmax=800" width="190" height="47"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En donde: &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-URHQ4Wrs1Ek/TjGM4mx_biI/AAAAAAAAAjw/E3VRC_2EzZM/s1600-h/clip_image015%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image015" border="0" alt="clip_image015" src="http://lh5.ggpht.com/-x4QEnEz-dGQ/TjGM7GlPK9I/AAAAAAAAAj0/YKMuAw5LxDQ/clip_image015_thumb.jpg?imgmax=800" width="164" height="75"&gt;&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;b&gt;&lt;i&gt;u&lt;/i&gt;&lt;/b&gt;, es el valor del píxel al que le vamos a extraer el bit  &lt;li&gt;&lt;b&gt;&lt;i&gt;B&lt;/i&gt;&lt;/b&gt;, es el número de bits usado para representar un píxel  &lt;li&gt;&lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt;, es el bit que queremos extraer de cada píxel, B es el menos significativo y 1 es el más significativo  &lt;li&gt;&lt;b&gt;&lt;i&gt;L&lt;/i&gt;&lt;/b&gt;, es en nivel máximo que puede tener nuestra imagen &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;A continuación se muestra el código de MATLAB para implementar la extracción de bits:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;function x = BitExtraction(myImagen, B, n ,L) &lt;/p&gt; &lt;p&gt;myImagenNueva = myImagen;&lt;/p&gt; &lt;p&gt;[rows cols] = size(myImagen);&lt;/p&gt; &lt;p&gt;for I = 1 : rows&lt;/p&gt; &lt;p&gt;for j = 1 : cols&lt;/p&gt; &lt;p&gt;u = double(myImagen(I,j));&lt;/p&gt; &lt;p&gt;iEne = floor(u/2^(B-n));&lt;/p&gt; &lt;p&gt;iEneMenosUno = floor(u/2^(B-(n-1)));&lt;/p&gt; &lt;p&gt;BitExtraido = iEne – (2*iEneMenosUno);&lt;/p&gt; &lt;p&gt;if BitExtraido == 1 &lt;/p&gt; &lt;p&gt;BitExtraido = L;&lt;/p&gt; &lt;p&gt;else&lt;/p&gt; &lt;p&gt;BitExtraido = 0;&lt;/p&gt; &lt;p&gt;end&lt;/p&gt; &lt;p&gt;myImagenNueva(I,j) = BitExtraido;&lt;/p&gt; &lt;p&gt;end&lt;/p&gt; &lt;p&gt;end&lt;/p&gt; &lt;p&gt;x = myImagenNueva; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt; &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;Código 1. Función en MATLAB para realizar extracción de bits a una imagen PGM&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;En las siguientes figuras se observan ejemplos de extracción del bit más significativo aplicados a un indicador no defectuoso y los casos de indicadores defectuosos.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-dZrOy6NSonY/TjGM8ArKGrI/AAAAAAAAAj4/WMDGyKoA1aI/s1600-h/clip_image017%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image017" border="0" alt="clip_image017" src="http://lh5.ggpht.com/-f52ZTZiruMQ/TjGM84g8OII/AAAAAAAAAj8/zKoRseR5rSI/clip_image017_thumb.jpg?imgmax=800" width="209" height="199"&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/-9o3WkyTpHZE/TjGM9QpiCbI/AAAAAAAAAkA/G1SqlDPRDkQ/s1600-h/clip_image019%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image019" border="0" alt="clip_image019" src="http://lh5.ggpht.com/-1IXD_bhjs_M/TjGM-BojN0I/AAAAAAAAAkE/AEhziUgeIi8/clip_image019_thumb.jpg?imgmax=800" width="214" height="206"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 6. Ejemplo de extracción del bit más significativo del inciso a) y b) de la figura 4&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-9Q5N_nGEQmo/TjGM-tKsqkI/AAAAAAAAAkI/NBdYEH3Bbeg/s1600-h/clip_image021%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image021" border="0" alt="clip_image021" src="http://lh3.ggpht.com/-frx0mjuUg6k/TjGM_U7k7UI/AAAAAAAAAkM/Aykb2yU_OTg/clip_image021_thumb.jpg?imgmax=800" width="211" height="206"&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/-MRlx3pqgB18/TjGM_1I3hPI/AAAAAAAAAkQ/i13Kc6KbBDw/s1600-h/clip_image023%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image023" border="0" alt="clip_image023" src="http://lh6.ggpht.com/-GnunKcBnnGg/TjGNBEooOQI/AAAAAAAAAkU/UIJ3S99Fb3U/clip_image023_thumb.jpg?imgmax=800" width="204" height="194"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 7. Ejemplo de extracción del bit más significativo del inciso c) y d) de la figura 4&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-moBnUw7V76s/TjGNBpBmwNI/AAAAAAAAAkY/g0Hk9QtCCzU/s1600-h/clip_image025%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image025" border="0" alt="clip_image025" src="http://lh4.ggpht.com/-DFDBSUc-aUc/TjGNCItiovI/AAAAAAAAAkc/1rtGgtRjRZQ/clip_image025_thumb.jpg?imgmax=800" width="205" height="196"&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/-cOu03doOuqY/TjGNCqAWp2I/AAAAAAAAAkg/92oIuvKIvL8/s1600-h/clip_image027%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image027" border="0" alt="clip_image027" src="http://lh6.ggpht.com/--57k9XcRPFM/TjGNDXpr0yI/AAAAAAAAAkk/4FLe7fEtkqw/clip_image027_thumb.jpg?imgmax=800" width="208" height="195"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 8. Ejemplo de extracción del bit más significativo del inciso a) y b) de la figura 5&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/--uK-acoKlFs/TjGNDx0P0LI/AAAAAAAAAko/yRmUCyxRmYg/s1600-h/clip_image029%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image029" border="0" alt="clip_image029" src="http://lh6.ggpht.com/-cfrjGU2qFxs/TjGNEZ1PRHI/AAAAAAAAAks/jfTnHZnCZnw/clip_image029_thumb.jpg?imgmax=800" width="208" height="200"&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/-ON_AcdnPGrU/TjGNE6JotOI/AAAAAAAAAkw/ablzTyBFf00/s1600-h/clip_image031%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image031" border="0" alt="clip_image031" src="http://lh4.ggpht.com/-AJLCOgDYrdg/TjGNF3E_YPI/AAAAAAAAAk0/kRgvaPgiuAU/clip_image031_thumb.jpg?imgmax=800" width="206" height="206"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 9. Ejemplo de extracción del bit más significativo del inciso c) y d) de la figura 5&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;Las figuras 6 y 7 nos muestran las imágenes con el bit más significativo extraído de la figura 4, éstas son para el caso con los indicadores con fondo blanco. Las figuras 8 y 9 son los equivalentes de la figura 5 y son para el caso con indicadores con fondo negro.&lt;/p&gt; &lt;p&gt;Como se puede observar en las imágenes anteriores al aplicarles el método de extracción de bits, la falta de luz debido al componente emisor de luz faltante se acentúa resaltando dicha característica en las imágenes. También se puede apreciar que la diferencia se ve marcada en una circunferencia hacia la orilla del perímetro del indicador. Para obtener una imagen con que resalte de una manera mas eficiente las características se puede enmascarar la imagen y extraer solamente la región de interés para ser analizada posteriormente y en base a eso decidir si el objeto bajo prueba es defectuoso o no.&lt;/p&gt; &lt;p&gt;El siguiente código en MATLAB muestra la función usada para extraer la región de interés en este caso.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Function imMasked = maskDonnutRegion(myImage, CentX, CentY, Rinf, Rsup)&lt;/p&gt; &lt;p&gt;h=CentX; k=CentY; &lt;/p&gt; &lt;p&gt;N=1024; t=(0:N)*2*pi/N; &lt;/p&gt; &lt;p&gt;x = Rsup*cos(t)+h; &lt;/p&gt; &lt;p&gt;y = Rsup*sin(t)+k; &lt;/p&gt; &lt;p&gt;BW = roipoly(myImage,x,y); &lt;/p&gt; &lt;p&gt;mask1 = uint8(BW); t=(0:N)*2*pi/N; &lt;/p&gt; &lt;p&gt;x = Rinf*cos(t)+h; y = Rinf*sin(t)+k; &lt;/p&gt; &lt;p&gt;BW = roipoly(myImage,x,y); &lt;/p&gt; &lt;p&gt;mask2 = uint8(~BW); &lt;/p&gt; &lt;p&gt;imMasked = uint8(myImage).*mask1.*mask2; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt; &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;Código 2. Función en MATLAB para realizar la selección de la región de interés&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;En el código anterior se usa la función &lt;b&gt;&lt;i&gt;roipoly&lt;a name="_ftnref3_8415" href="#_ftn3_8415"&gt;&lt;b&gt;[3]&lt;/b&gt;&lt;/a&gt;&lt;/i&gt; &lt;/b&gt;incluida en MATLAB y se usa para seleccionar una región poligonal de interés. Para este ejemplo el polígono se define de manera de círculo, y se usan dos círculos para definir el perímetro superior y el perímetro inferior en el cual se va a enmascarar la imagen. &lt;/p&gt; &lt;p&gt;A continuación se muestra los ejemplos de las imágenes resultado de la extracción del bit más significativo.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-NtwB8SpP-O4/TjGNGBD0__I/AAAAAAAAAk4/J2vcEarEOls/s1600-h/clip_image033%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image033" border="0" alt="clip_image033" src="http://lh3.ggpht.com/-v-Swk8LyoXw/TjGNGuJ_PrI/AAAAAAAAAk8/oqQbYB6McUs/clip_image033_thumb.jpg?imgmax=800" width="208" height="198"&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/-TAU6UqeQUlY/TjGNHJFqcgI/AAAAAAAAAlA/CcYqV5k8I6A/s1600-h/clip_image035%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image035" border="0" alt="clip_image035" src="http://lh5.ggpht.com/-K-tOqF7qqds/TjGNHi_1iSI/AAAAAAAAAlE/JFmfW3MTimE/clip_image035_thumb.jpg?imgmax=800" width="214" height="206"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 10. Ejemplo de selección de región de interés del ejemplo de la figura 6&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-PyonDW6Cros/TjGNITqeTUI/AAAAAAAAAlI/SUwi-XuUl04/s1600-h/clip_image037%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image037" border="0" alt="clip_image037" src="http://lh4.ggpht.com/-4Jt_Z4_-ppQ/TjGNI6ZTaMI/AAAAAAAAAlM/Bs7bQIrHX7A/clip_image037_thumb.jpg?imgmax=800" width="211" height="206"&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/-Ks_gY4HG45w/TjGNJWjW-kI/AAAAAAAAAlQ/IUYRDXPpcL0/s1600-h/clip_image039%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image039" border="0" alt="clip_image039" src="http://lh3.ggpht.com/-G3rrX23szco/TjGNJ20a3vI/AAAAAAAAAlU/KJV1j8qkTWw/clip_image039_thumb.jpg?imgmax=800" width="204" height="194"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 11. Ejemplo de selección de región de interés del ejemplo de la figura 7&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-wQM01MORc80/TjGNLX4Ii-I/AAAAAAAAAlY/YlaIZbNJsKg/s1600-h/clip_image041%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image041" border="0" alt="clip_image041" src="http://lh4.ggpht.com/-i-J1tyhERwU/TjGNT273eKI/AAAAAAAAAlc/HGZ3ZPdMlnc/clip_image041_thumb.jpg?imgmax=800" width="205" height="196"&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/-YdwV8MexJDQ/TjGNVWbI5tI/AAAAAAAAAlg/PH8ZIoLldqo/s1600-h/clip_image043%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image043" border="0" alt="clip_image043" src="http://lh5.ggpht.com/-YCMxZezQWJs/TjGNXL-PiUI/AAAAAAAAAlk/PCh2p9iawE0/clip_image043_thumb.jpg?imgmax=800" width="206" height="206"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 12. Ejemplo de selección de región de interés del ejemplo de la figura 8&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Dn8D4rTNW-8/TjGNXg4THuI/AAAAAAAAAlo/hkUVPEZ_AUs/s1600-h/clip_image045%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image045" border="0" alt="clip_image045" src="http://lh6.ggpht.com/-SqOROQ8DIJ0/TjGNY9QhF6I/AAAAAAAAAls/CGQJOt_rq90/clip_image045_thumb.jpg?imgmax=800" width="208" height="195"&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/-B94hObWfv1U/TjGNlxm1SaI/AAAAAAAAAlw/hldrlMl02Ws/s1600-h/clip_image047%25255B3%25255D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image047" border="0" alt="clip_image047" src="http://lh5.ggpht.com/-8sEH43txLN0/TjGNmgqNAvI/AAAAAAAAAl0/BNe2nrpq-Ac/clip_image047_thumb.jpg?imgmax=800" width="208" height="200"&gt;&lt;/a&gt;  &lt;table border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="590"&gt; &lt;p&gt;&lt;i&gt;Figura 13. Ejemplo de selección de región de interés del ejemplo de la figura 9&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;Como se puede apreciar en las imágenes anteriores se observa que la imagen resultante muestra cambios significativos entre las imágenes que no presentan defectos (primera imagen de las figuras 10 y 12) y las imágenes defectuosas.&lt;/p&gt; &lt;p&gt;A las imágenes resultantes se les aplicaron dos técnicas de medición estadísticas para analizar los resultados y ver si se pueden definir los límites para determinar si la imagen es buena o mala.&lt;/p&gt; &lt;p&gt;Una de las mediciones usadas es la media, la cual calcula el promedio de los valores de la imagen. La función usada es &lt;b&gt;&lt;i&gt;mean&lt;/i&gt;&lt;/b&gt;, se representa de la siguiente manera.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-1fhlfW57BMY/TjGNm6RFUyI/AAAAAAAAAl4/Piqz8_zkIEQ/s1600-h/clip_image048%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image048" border="0" alt="clip_image048" src="http://lh5.ggpht.com/-HiODga6DmMM/TjGNnVcahtI/AAAAAAAAAl8/uKIQTSte6Vo/clip_image048_thumb.gif?imgmax=800" width="106" height="58"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;También se calculó la desviación estándar de las imágenes procesadas. La desviación estándar se representa de la siguiente manera. La función usada es &lt;b&gt;&lt;i&gt;std&lt;a name="_ftnref4_8415" href="#_ftn4_8415"&gt;&lt;b&gt;[4]&lt;/b&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-6CnEVa-qjFc/TjGNn9BHbtI/AAAAAAAAAmA/0XWysXFcsU8/s1600-h/clip_image049%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image049" border="0" alt="clip_image049" src="http://lh6.ggpht.com/-OalMS9UltZY/TjGNouwajYI/AAAAAAAAAmE/N912l6U4PLM/clip_image049_thumb.gif?imgmax=800" width="187" height="64"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una tercera técnica usada es la entropía, la función usada es &lt;b&gt;&lt;i&gt;wentropy&lt;/i&gt;&lt;/b&gt;&lt;a name="_ftnref5_8415" href="#_ftn5_8415"&gt;[5]&lt;/a&gt;&lt;b&gt;&lt;i&gt;,&lt;/i&gt;&lt;/b&gt; ésta función es usada para criterios de selección debido a que describe propiedades relacionadas con la información de una señal dada, en este caso una imagen en escala de grises. La definición de la función usada esta dada por:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-XLvig3Jhp4I/TjGNpKrNFdI/AAAAAAAAAmI/VlVdPA_3Gew/s1600-h/clip_image050%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image050" border="0" alt="clip_image050" src="http://lh6.ggpht.com/-KyblAJrK-HI/TjGNpv62ibI/AAAAAAAAAmM/KPpq-bxj_do/clip_image050_thumb.gif?imgmax=800" width="136" height="51"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-pKi0iQazuyU/TjGNqHo9GKI/AAAAAAAAAmQ/tHeUg-hV490/s1600-h/clip_image051%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image051" border="0" alt="clip_image051" src="http://lh6.ggpht.com/-E1JLjWh5IVk/TjGNqeKfclI/AAAAAAAAAmU/6VT8yXiVmfQ/clip_image051_thumb.gif?imgmax=800" width="160" height="35"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-8ktdkeGj9uQ/TjGNrQPckGI/AAAAAAAAAmY/R8q1KG7GFKY/s1600-h/clip_image052%25255B3%25255D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image052" border="0" alt="clip_image052" src="http://lh3.ggpht.com/-orAy0zJxWrI/TjGNse0o1PI/AAAAAAAAAmc/6FuvDYg_Gj4/clip_image052_thumb.gif?imgmax=800" width="181" height="42"&gt;&lt;/a&gt;&lt;/p&gt; &lt;hr align="left" size="1" width="33%"&gt;  &lt;p&gt;&lt;a name="_ftn1_8415" href="#_ftnref1_8415"&gt;[1]&lt;/a&gt; &lt;a href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;http://netpbm.sourceforge.net/doc/pgm.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a name="_ftn2_8415" href="#_ftnref2_8415"&gt;[2]&lt;/a&gt; Jain, Anil K. Fundamentals of Digital Image Processing, Prentice Hall, 1989, USA&lt;/p&gt; &lt;p&gt;&lt;a name="_ftn3_8415" href="#_ftnref3_8415"&gt;[3]&lt;/a&gt; Ver ayuda de MATLAB: &lt;i&gt;help roipoly&lt;/i&gt;&lt;/p&gt; &lt;p&gt;&lt;a name="_ftn4_8415" href="#_ftnref4_8415"&gt;[4]&lt;/a&gt; Ver ayuda de MATLAB: &lt;i&gt;mean&lt;/i&gt; y &lt;i&gt;std&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;&lt;a name="_ftn5_8415" href="#_ftnref5_8415"&gt;[5]&lt;/a&gt; Ver ayuda de MATLAB: &lt;i&gt;doc wentropy&lt;/i&gt;. Esta función esta incluida en el toolbox de wavelets.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-5880143611092040032?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/5880143611092040032/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2011/07/algoritmo-de-deteccion-de-iluminacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/5880143611092040032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/5880143611092040032'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2011/07/algoritmo-de-deteccion-de-iluminacion.html' title='Algoritmo de detección de iluminación defectuosa en indicadores de paneles de instrumentación – Parte I (Teoría)'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-p9JOgUrpEps/TjGMfzt7q6I/AAAAAAAAAi0/jO7nnig_5S0/s72-c/clip_image001_thumb.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1418319059024841052</id><published>2011-04-25T00:16:00.001-06:00</published><updated>2011-04-25T00:22:27.678-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial basico de GUIDE en MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='GUIDE'/><title type='text'>Ejemplo simple de Listbox en GUIDE de MATLAB 7.0</title><content type='html'>&lt;p&gt;En el siguiente ejemplo se muestra como agregar un Listbox, introducir nuevos elementos a la lista y desplegar un valor seleccionado de la lista. &lt;a target="_blank" href="https://sites.google.com/site/dipuacj/files/Ejemplo_ListBox.zip?attredirects=0&amp;amp;d=1"&gt;El código se puede descargar aquí&lt;/a&gt;. La explicación paso a paso va como sigue:&lt;/p&gt;  &lt;p align="justify"&gt;Iniciamos tecleando “guide” desde la línea de comandos de MATLAB como se muestra en la siguiente figura:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURebF4p2I/AAAAAAAAAfc/HRvpAyn4CHI/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbUReylwB3I/AAAAAAAAAfg/XMa3XTG6Gdk/image_thumb%5B7%5D.png?imgmax=800" width="549" height="154" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Y nos mostrará el cuadro de dialogo de GUIDE como se muestra en la imagen siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURfMXf_HI/AAAAAAAAAfk/_4P-f4EK7hc/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURfsTx1LI/AAAAAAAAAfo/lktX2zcPIVI/image_thumb%5B1%5D.png?imgmax=800" width="554" height="384" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Elegimos “Blank GUI (Default)” y presionamos “OK”, dependiendo de la velocidad de la máquina con que estemos trabajando nos mostrará el siguiente cuadro de dialogo… hay que esperar a que se inicialice todo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURgGJjMfI/AAAAAAAAAfs/kV-dk7Q6ZKs/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURgtLzt7I/AAAAAAAAAfw/-VHqEWsw094/image_thumb%5B8%5D.png?imgmax=800" width="237" height="90" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Enseguida nos muestra la pantalla principal de GUIDE, que es donde vamos a empezar a agregar controles para hacer nuestra aplicación.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURhpHrlVI/AAAAAAAAAf0/7ru4o7Jb1qo/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURiBRb_SI/AAAAAAAAAf4/Np1IioPGOHg/image_thumb%5B9%5D.png?imgmax=800" width="677" height="560" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En este punto es bueno grabarlo con un nombre, por si las dudas para si algo, para poderlo estar grabando continuamente. En este caso yo lo nombré: “Ejemplo_ListBox.fig”, automáticamente genera el código “Ejemplo_ListBox.m” en el que vamos a estar trabajando.&lt;/p&gt;  &lt;p align="justify"&gt;A continuación seleccionamos la herramienta “Listbox” y dibujamos la lista en el área de trabajo como se puede observar en la imagen siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/TbURjD1O9RI/AAAAAAAAAf8/gi480CsQSnM/s1600-h/image%5B18%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURjlUjHbI/AAAAAAAAAgA/XY1O8JrYdSg/image_thumb%5B10%5D.png?imgmax=800" width="679" height="561" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Una vez con el control “Listbox” en el área de trabajo lo siguiente es personalizarlo, para darle un nombre e inicializarlo de requerirse así. Tenemos que dar click izquierdo sobre el control y seleccionar “Property inspector” como se muestra en la imagen siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURkfR0H3I/AAAAAAAAAgE/qTg3h3unh5E/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURlG4rYKI/AAAAAAAAAgI/bN5DPc44VJo/image_thumb%5B11%5D.png?imgmax=800" width="465" height="495" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una vez seleccionado “Property Inspector” nos debe aparecer una ventana como se muestra a continuación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURl-mapCI/AAAAAAAAAgM/kbSf_cJOIBA/s1600-h/image%5B27%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TbURmTu3PQI/AAAAAAAAAgQ/ob3EYYu0GrQ/image_thumb%5B13%5D.png?imgmax=800" width="553" height="724" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En la imagen anterior se muestran todas las propiedades de nuestro control, para este ejemplo solamente modificaremos los campos de:&lt;/p&gt;  &lt;p&gt;1. String: Que es básicamente el texto que aparece en nuestra GUI&lt;/p&gt;  &lt;p&gt;2. Tag: Que es el nombre que tiene en nuestra aplicación este objeto&lt;/p&gt;  &lt;p&gt;Si lo ejecutamos (Ctrl + T) en este momento, debemos tener una ventana como se muestra a continuación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURm4cKFrI/AAAAAAAAAgU/Yszxjtyv5I4/s1600-h/image%5B30%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURnRgypAI/AAAAAAAAAgY/CXwKiOnsmDQ/image_thumb%5B14%5D.png?imgmax=800" width="568" height="454" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Ahora vamos a agregarle un botón para mostrar en un mensaje el texto que tenemos seleccionado en el “Listbox”, yo lo llame “miBoton” y le puse “Mostrar Selección”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURosOzwhI/AAAAAAAAAgc/ojRbEcwGBWs/s1600-h/image%5B33%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TbURpLWjKcI/AAAAAAAAAgg/JrqYNyrL-ZA/image_thumb%5B15%5D.png?imgmax=800" width="677" height="560" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ahora tenemos que agregarle código al botón para que muestre lo que tenemos seleccionado, para eso tenemos que dar click derecho sobre el botón y seleccionar “View Callbacks –&amp;gt; Callback” como se muestra en la imagen siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/TbURqSQ9MmI/AAAAAAAAAgk/3YYnob02d0I/s1600-h/image%5B36%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TbURq41Pg1I/AAAAAAAAAgo/5LPRSCWpKJI/image_thumb%5B16%5D.png?imgmax=800" width="673" height="556" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La pantalla siguiente nos lleva a nuestro editor y se muestra seleccionado el inicio del callback, notese que el callback es donde agregamos el código de la acción que va a realizar nuestro objeto, en este caso el botón.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TbURrYK7TKI/AAAAAAAAAgs/6EZP9K6_ZpA/s1600-h/image%5B42%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURs7QiJlI/AAAAAAAAAgw/YXki2M5g3-8/image_thumb%5B26%5D.png?imgmax=800" width="844" height="509" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ahora agregamos el siguiente código en el miBoton_Callback:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#008000"&gt;% --- Executes on button press in miBoton.&lt;/font&gt;       &lt;br /&gt;function miBoton_Callback(hObject, eventdata, handles)       &lt;br /&gt;&lt;font color="#008000"&gt;% hObject&amp;#160;&amp;#160;&amp;#160; handle to miBoton (see GCBO)        &lt;br /&gt;% eventdata&amp;#160; reserved - to be defined in a future version of MATLAB         &lt;br /&gt;% handles&amp;#160;&amp;#160;&amp;#160; structure with handles and user data (see GUIDATA)&lt;/font&gt; &lt;/p&gt;    &lt;p&gt;miTexto = get(handles.miCajaDeLista,&lt;font color="#400080"&gt;'string'&lt;/font&gt;)&amp;#160; &lt;font color="#008000"&gt;%Obtiene todos los valores de la lista&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;indice_seleccionado = get(handles.miCajaDeLista,&lt;font color="#400080"&gt;'Value'&lt;/font&gt;); &lt;font color="#008000"&gt;%Nos dice que posición esta seleccionada&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;h = msgbox(miTexto,'&lt;font color="#400080"&gt;¿Qué tenemos?','help'&lt;/font&gt;)&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;%Muestra la selección en una caja de texto&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;font color="#000000"&gt;El código anterior simplemente muestra la selección en una caja de texto, para mostrar como agregar items en tiempo real a la lista acomodamos el tamaño de la lista y agregamos otro botón para introducir lo que nosotros necesitemos en el “Listbox”, como se muestra en la imagen siguiente:&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TbURuMMAJ9I/AAAAAAAAAg0/5qbcCQ4ka5A/s1600-h/image%5B45%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TbURuusg2vI/AAAAAAAAAg4/uUn7IsYbSa8/image_thumb%5B27%5D.png?imgmax=800" width="677" height="560" /&gt;&lt;/a&gt;   &lt;p&gt;A continuación se muestra el código de Agregar_Listbox_Callback, con este código se agrega un nuevo Item en la lista.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#008000"&gt;% --- Executes on button press in Agregar_Listbox.        &lt;br /&gt;&lt;/font&gt;function Agregar_Listbox_Callback(hObject, eventdata, handles)       &lt;br /&gt;&lt;font color="#008000"&gt;% hObject&amp;#160;&amp;#160;&amp;#160; handle to Agregar_Listbox (see GCBO)        &lt;br /&gt;% eventdata&amp;#160; reserved - to be defined in a future version of MATLAB         &lt;br /&gt;% handles&amp;#160;&amp;#160;&amp;#160; structure with handles and user data (see GUIDATA) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#008000"&gt;% Muestra un cuadro de dialogo para introducir un nuevo item en la lista        &lt;br /&gt;&lt;/font&gt;prompt = {&lt;font color="#400080"&gt;'Nombre'&lt;/font&gt;};       &lt;br /&gt;dlg_title =&lt;font color="#400080"&gt; 'Agrega un Item a la Lista'&lt;/font&gt;;       &lt;br /&gt;respuesta&amp;#160; = inputdlg(prompt,dlg_title); &lt;/p&gt;    &lt;p&gt;&lt;font color="#008000"&gt;% Obtiene todos el contenido de la lista&lt;/font&gt;       &lt;br /&gt;t = get(handles.miCajaDeLista, &lt;font color="#400080"&gt;'String'&lt;/font&gt;);       &lt;br /&gt;if ischar(t); t = cellstr(t); end &lt;/p&gt;    &lt;p&gt;&lt;font color="#008000"&gt;% Agrega el nuevo Item en la lista        &lt;br /&gt;&lt;/font&gt;t = [t; respuesta];       &lt;br /&gt;&lt;font color="#008000"&gt;% Muestra el nuevo Item en la lista        &lt;br /&gt;&lt;/font&gt;set(handles.miCajaDeLista, &lt;font color="#400080"&gt;'String'&lt;/font&gt;, t); &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A continuación se muestra como se ve cuando ejecutamos el GUI y le agregamos un nuevo Item.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TbURvP8gujI/AAAAAAAAAg8/I2JjQI__uAw/s1600-h/image%5B48%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TbURvuBmm3I/AAAAAAAAAhA/z7ecUKDhrvE/image_thumb%5B28%5D.png?imgmax=800" width="566" height="447" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Y como se despliega el Item seleccionado en el “Listbox”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURwDQlklI/AAAAAAAAAhE/-yOmPJiQ6XU/s1600-h/image%5B51%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TbURwjtvaVI/AAAAAAAAAhI/-U9KVbRlZCo/image_thumb%5B29%5D.png?imgmax=800" width="569" height="450" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1418319059024841052?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1418319059024841052/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2011/04/ejemplo-simple-de-listbox-en-guide-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1418319059024841052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1418319059024841052'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2011/04/ejemplo-simple-de-listbox-en-guide-de.html' title='Ejemplo simple de Listbox en GUIDE de MATLAB 7.0'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iCpJOoYu6qU/TbUReylwB3I/AAAAAAAAAfg/XMa3XTG6Gdk/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1685587225130710757</id><published>2010-12-01T14:28:00.001-07:00</published><updated>2010-12-01T14:28:50.829-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='Cuantización'/><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Quantization'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><title type='text'>Implementación de un cuantizador “midtread” en MATLAB 7.0</title><content type='html'>&lt;p align="justify"&gt;La cuantización es el paso necesario para convertir una señal analógica a una digital, cuando se muestrea una señal se convierte del mundo analógico al mundo digital, y es necesario expresarlo en 0s y 1s, dícese bits. Aunque no necesariamente es el proceso de una señal analógica per se, puede ser también, por ejemplo, una imagen que necesita ser representada con una cantidad menor de bits, y por lo consiguiente comprimirla, con pérdidas claro está.&lt;/p&gt;  &lt;p align="justify"&gt;Existen variados tipos de cuantización. El tipo de cuantizador se elige dependiendo de la aplicación en que vaya a ser implementado, esto, de acuerdo a las características de la señal. En este caso se hará un pequeño ejemplo con un cuantizador &lt;em&gt;&lt;strong&gt;midtread&lt;/strong&gt;&lt;/em&gt; la grafica siguiente muestra el comportamiento de un cuantizador midtread de 3bits.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/TPa93nKTgDI/AAAAAAAAAdI/eck_2KtaO_g/s1600-h/cuantizacin3.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="cuantización" border="0" alt="cuantización" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TPa96P_0YHI/AAAAAAAAAdM/XcRr0CPh-0A/cuantizacin_thumb1.jpg?imgmax=800" width="683" height="537" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figura 1. Características de un cuantizador midtread de 3 bits&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El principal uso de este cuantizador es cuando tenemos una señal simétrica en el espectro positivo y negativo, por ejemplo una señal de audio, aunque también se puede aplicar en una imagen, como se muestra en el párrafo siguiente.&lt;/p&gt;  &lt;p align="justify"&gt;En la Figura 1 el eje equis (x) representa la señal a cuantizar y el eje ye (y) es la información ya cuantizada, delta () son los incrementos en los que se va a dividir la señal y esto depende del número de bits que sea el cuantizador, de lo anterior se puede desprender la siguiente tabla:&lt;/p&gt;  &lt;div align="center"&gt;   &lt;table border="2" cellspacing="0" cellpadding="2" width="610" align="center"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="186"&gt;&lt;strong&gt;Código binario&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;Nivel de Cuantización (y)&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="220"&gt;&lt;strong&gt;Rango de la señal de entrada (x)&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;           &lt;p align="center"&gt;011&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;-3∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;–3.5∆ &amp;lt;= x &amp;lt; –2.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;           &lt;p align="center"&gt;010&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;-2∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;–2.5∆ &amp;lt;= x &amp;lt; –1.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;001&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;-1∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;–1.5∆ &amp;lt;= x &amp;lt; –0.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;0&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;–0.5∆ &amp;lt;= x &amp;lt; 0&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;100&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;0&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;0 &amp;lt;= x &amp;lt; 0.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;101&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;1∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;0.5∆ &amp;lt;= x &amp;lt; 1.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;110&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;2∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;1.5∆ &amp;lt;= x &amp;lt; 2.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="186"&gt;111&lt;/td&gt;          &lt;td valign="top" width="200"&gt;           &lt;p align="center"&gt;3∆&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="220"&gt;           &lt;p align="center"&gt;2.5∆ &amp;lt;= x &amp;lt; 3.5∆&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p align="left"&gt;La variable delta (∆) puede ser calculada de la siguiente manera &lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPa97XzWWCI/AAAAAAAAAdQ/_-JR7I6TpuU/s1600-h/clip_image0023.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_iCpJOoYu6qU/TPa99FvoToI/AAAAAAAAAdU/SkK7SPrWYJ8/clip_image002_thumb.gif?imgmax=800" width="241" height="36" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Ora si, vamos a ver el siguiente ejemplo, tenemos la señal de entrada x(n) = 254 254 252 254 255 253 y el rango válido de datos es de 250 a 255, que bien puede ser parte de una imagen ;) .&lt;/p&gt;  &lt;p align="left"&gt;El primer paso es calcular delta.&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/TPa9-WKlO0I/AAAAAAAAAdY/rUfrD68_XC0/s1600-h/clip_image00242.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TPa9_9A6KJI/AAAAAAAAAdc/4WQeUE-oXwM/clip_image0024_thumb.gif?imgmax=800" width="188" height="36" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Sustituyendo ∆ en la tabla anterior tenemos:&lt;/p&gt;  &lt;table border="2" cellspacing="0" cellpadding="2" width="610" align="center"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="186"&gt;&lt;strong&gt;Código binario&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;strong&gt;Nivel de Cuantización (y)&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="220"&gt;&lt;strong&gt;Rango de la señal de entrada (x)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;011&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;-3(0.71428) = -2.14284&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;–2.5 &amp;lt;= x &amp;lt; –1.7857&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;010&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;-2(0.71428) = -1.42856&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;–1.7857 &amp;lt;= x &amp;lt; –1.07142&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;001&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;-1(0.71428) = 0.71428&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;–1.07142 &amp;lt;= x &amp;lt; –0.35714&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;000&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;0&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;–0.35714 &amp;lt;= x &amp;lt; 0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;100&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;0&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;0 &amp;lt;= x &amp;lt; 0.35714&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;101&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;1(0.71428) = 0.71428&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;0.35714&amp;lt;= x &amp;lt; 1.07142&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;110&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;2(0.71428) = 1.42856&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;1.07142 &amp;lt;= x &amp;lt; 1.7857&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;         &lt;p align="center"&gt;111&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="200"&gt;         &lt;p align="center"&gt;3(0.71428) = 2.14284&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="220"&gt;         &lt;p align="center"&gt;1.7857 &amp;lt;= x &amp;lt; 2.5&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="left"&gt;Para poder tener los datos de forma como se muestra en la Figura 1, es necesario definir cual es la media de nuestro rango, que en este caso es:&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/TPa-BTMwP1I/AAAAAAAAAdg/ehQdyhBIuOs/s1600-h/clip_image00262.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002[6]" border="0" alt="clip_image002[6]" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TPa-DsVvfyI/AAAAAAAAAdk/Mefjr8svLPw/clip_image0026_thumb.gif?imgmax=800" width="193" height="36" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Si restamos a la señal de entrada la media obtenida en el paso anterior tenemos que:&lt;/p&gt;  &lt;p align="center"&gt;x(n) – µ = 1.5 1.5 -0.5 1.5 2.5 0.5&lt;/p&gt;  &lt;p align="left"&gt;ahora el siguiente paso es cuantizar cada valor utilizando la tablita arriba descrita…&lt;/p&gt;  &lt;p align="justify"&gt;x(0) = 1.5, cae entre 1.07142 y 1.7857 a lo cual corresponde un valor de cuantización de 1.42856 o sea 110 binario.&lt;/p&gt;  &lt;p align="justify"&gt;x(1) = 1.5, cae entre 1.07142 y 1.7857 a lo cual corresponde un valor de cuantización de 1.42856 o sea 110 binario.&lt;/p&gt;  &lt;p align="justify"&gt;x(2) = –0.5, cae entre –0.35714 y –1.07142 a lo cual corresponde un valor de cuantización de –1.42856 o sea 010 binario.&lt;/p&gt;  &lt;p align="justify"&gt;x(3) = 1.5, cae entre 1.07142 y 1.7857 a lo cual corresponde un valor de cuantización de 1.42856 o sea 110 binario.&lt;/p&gt;  &lt;p align="justify"&gt;x(4) = 2.5, cae entre 1.7857 y 2.5 a lo cual corresponde un valor de cuantización de 2.14284 o sea 111 binario.&lt;/p&gt;  &lt;p align="justify"&gt;x(5) = 0.5 cae entre 0.35714 y 1.07142 a lo cual corresponde un valor de cuantización de 1.42856 o sea 010 binario.&lt;/p&gt;  &lt;p align="justify"&gt;A continuación se presenta el código en MATLAB 7.0 para llevar a cabo esta cuantización:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;x = [254 254 252 254 255 253]; &lt;/p&gt;    &lt;p&gt;bits = 3;     &lt;br /&gt;rango_superior = 255;      &lt;br /&gt;rango_inferior = 250; &lt;/p&gt;    &lt;p&gt;delta = (rango_superior - rango_inferior)/((2^bits)-1) &lt;/p&gt;    &lt;p&gt;mu = ((rango_superior - rango_inferior)/2) + rango_inferior &lt;/p&gt;    &lt;p&gt;x_centrada = x - mu &lt;/p&gt;    &lt;p&gt;x_cuantizada = floor(x_centrada/delta+0.5) * delta&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;y los resultados son: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;delta = &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 0.7143 &lt;/p&gt;    &lt;p&gt;mu = &lt;/p&gt;    &lt;p&gt;&amp;#160; 252.5000 &lt;/p&gt;    &lt;p&gt;x_centrada = &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 1.5000&amp;#160;&amp;#160;&amp;#160; 1.5000&amp;#160;&amp;#160; -0.5000&amp;#160;&amp;#160;&amp;#160; 1.5000&amp;#160;&amp;#160;&amp;#160; 2.5000&amp;#160;&amp;#160;&amp;#160; 0.5000 &lt;/p&gt;    &lt;p&gt;x_cuantizada = &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 1.4286&amp;#160;&amp;#160;&amp;#160; 1.4286&amp;#160;&amp;#160; -0.7143&amp;#160;&amp;#160;&amp;#160; 1.4286&amp;#160;&amp;#160;&amp;#160; 2.8571&amp;#160;&amp;#160;&amp;#160; 0.7143&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1685587225130710757?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1685587225130710757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2010/12/implementacion-de-un-cuantizador.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1685587225130710757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1685587225130710757'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2010/12/implementacion-de-un-cuantizador.html' title='Implementación de un cuantizador “midtread” en MATLAB 7.0'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iCpJOoYu6qU/TPa96P_0YHI/AAAAAAAAAdM/XcRr0CPh-0A/s72-c/cuantizacin_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-8178500580896771581</id><published>2010-11-29T13:49:00.001-07:00</published><updated>2010-11-29T13:49:33.075-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='DPCM'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Compresión Diferencial'/><title type='text'>DPCM (Differential Pulse Code Modulation), Método diferencial para compresión de señales, Parte I, puro rollo</title><content type='html'>&lt;p&gt;La teoría del siguiente choro mareador y las figuras pirateadas fueron tomad@s de: &lt;/p&gt;  &lt;p&gt;Data Compression: The Complete Reference. David Salomon. Fourth Edition. Springer. 2007. Section 4.26: DPCM&lt;/p&gt;  &lt;p&gt;Digital Signal Processing: Fundamentals and Applications. Li Tan. Academic Press. 2008. Section 11.3: Examples of Differential Pulse Code Modulation, and Adaptive DPCM G.721&lt;/p&gt;  &lt;p&gt;La inspiración no vino sola, gracias I :), &lt;/p&gt;  &lt;p&gt;La compresión por DPCM es parte de la familia de métodos compresión por codificación diferencial. La idea general es usar valores pasados recuperados como base para predecir el dato actual de entrada. Esto se basa en el hecho, por ejemplo, que los pixeles en una imagen o muestras adyacentes en el audio digitalizado se encuentran correlacionadas. Los valores correlacionados son generalmente similares, así que sus diferencias son pequeñas, esto resultando en una compresión.&lt;/p&gt;  &lt;p&gt;A continuación se muestra el esquema simple de compresión diferencial para poder entender el principio del DPCM.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/TPQRtf7zC2I/AAAAAAAAAcQ/4poF0rp9WjE/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRuM6lcHI/AAAAAAAAAcU/uGSHlfzcW3I/image_thumb1.png?imgmax=800" width="434" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Codificador&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Decodificador&lt;/p&gt;  &lt;p align="center"&gt;Figura 1. CoDec Diferencial&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;La imagen anterior muestra un ejemplo de un codificador diferencial, se observa como el dato actual &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TPQRvHqGWVI/AAAAAAAAAcY/jgzdpf32ycE/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRvjfzOVI/AAAAAAAAAcc/I-TGKi34Q3Y/image_thumb4.png?imgmax=800" width="16" height="13" /&gt;&lt;/a&gt; se almacena en una unidad de almacenamiento, llámese “Delay” (o retardo pues si no les gusta agringarse), para ser usado para codificar el siguiente dato, o sea, &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRwHLZhII/AAAAAAAAAcg/PfvrChDMxGA/s1600-h/image13.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TPQRwv0CF9I/AAAAAAAAAck/RtJviIZEJ1I/image_thumb7.png?imgmax=800" width="33" height="14" /&gt;&lt;/a&gt;. Claro, la explicación anterior esta sumamente simplificada, en este ejemplo se muestra el uso de un cuantizador, eso significa que se tiene una compresión con perdidas o “&lt;em&gt;lossy”&lt;/em&gt; y esto significa que nuestro dato codificado es realmente &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/TPQRxy3Qw9I/AAAAAAAAAco/2Ye7gdjW_TM/s1600-h/image20.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TPQRy74BjrI/AAAAAAAAAcs/CZ9wsB_L6O8/image_thumb12.png?imgmax=800" width="12" height="17" /&gt;&lt;/a&gt; el cual ya contiene un error de cuantización. Esto significa que la codificación por diferencias (o diferencial, como ustedes gusten y manden) nos mete en un nuevo problema: &lt;u&gt;La acumulación de errores&lt;/u&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Entonces hay que tomar ventaja de lo que se menciona anteriormente, los datos que se van a comprimir están correlacionados. Esto significa que en general un dato depende de &lt;strong&gt;varios&lt;/strong&gt; de sus vecinos, no solamente del anterior. Una mejor predicción puede ser lograda usando &lt;strong&gt;N&lt;/strong&gt; de los datos previos para codificar el valor actual &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TPQRvHqGWVI/AAAAAAAAAcY/jgzdpf32ycE/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRvjfzOVI/AAAAAAAAAcc/I-TGKi34Q3Y/image_thumb4.png?imgmax=800" width="16" height="13" /&gt;&lt;/a&gt;, entonces tendremos una función &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRzKL1dxI/AAAAAAAAAcw/MGWxakp93aE/s1600-h/image29.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TPQR0FPkmaI/AAAAAAAAAc0/2gQJu_9is7c/image_thumb17.png?imgmax=800" width="40" height="14" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQR0vcPynI/AAAAAAAAAc4/JiSLAR1ElwA/s1600-h/image30.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TPQR1A2XbfI/AAAAAAAAAc8/hixWuhvZVoI/image_thumb18.png?imgmax=800" width="143" height="15" /&gt;&lt;/a&gt;, para predecir el dato actual &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/TPQRvHqGWVI/AAAAAAAAAcY/jgzdpf32ycE/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRvjfzOVI/AAAAAAAAAcc/I-TGKi34Q3Y/image_thumb4.png?imgmax=800" width="16" height="13" /&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ora si, en seguida pueden observar (jeje, como visita al museo) el diagrama del DPCM. (oooooohhhh!)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQR12D2WHI/AAAAAAAAAdA/ktjcEQWFg9I/s1600-h/image34.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQR3CPJ6CI/AAAAAAAAAdE/KMWFhnnxyWM/image_thumb20.png?imgmax=800" width="483" height="176" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Codificador&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Decodificador&lt;/p&gt;  &lt;p align="center"&gt;Figura 2. DPCM&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Oquey, oquey, haber encuentren la(s) diferencia(s) entre la Figura 1 y la Figura 2. ¿Está fácil? ¿que no? …&lt;/p&gt;  &lt;p align="justify"&gt;…&lt;/p&gt;  &lt;p align="justify"&gt;…&lt;/p&gt;  &lt;p align="justify"&gt;Pues si, cambiamos “&lt;em&gt;Delay”&lt;/em&gt; por &lt;em&gt;“Pred.”&lt;/em&gt; y se acabo el asunto.&lt;/p&gt;  &lt;p align="justify"&gt;Si.&lt;/p&gt;  &lt;p align="justify"&gt;Como se explicaba antes, el predictor viene siendo la funcioncica esta:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRzKL1dxI/AAAAAAAAAcw/MGWxakp93aE/s1600-h/image29.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/TPQR0FPkmaI/AAAAAAAAAc0/2gQJu_9is7c/image_thumb17.png?imgmax=800" width="40" height="14" /&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/TPQR0vcPynI/AAAAAAAAAc4/JiSLAR1ElwA/s1600-h/image30.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/TPQR1A2XbfI/AAAAAAAAAc8/hixWuhvZVoI/image_thumb18.png?imgmax=800" width="143" height="15" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En donde tenemos que es una función que nos afecta un conjunto de &lt;strong&gt;&lt;em&gt;N&lt;/em&gt;&lt;/strong&gt; pixeles y en base a esto obtenemos una mejor predicción de nuestro valor actual, es decir tratamos de minimizar el error introducido por la cuantificación.&lt;/p&gt;  &lt;p align="justify"&gt;Esta es la primera parte de dos, en esta ocasión fue el rollo previo a un ejemplo peque para poder explicar la DPCM.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-8178500580896771581?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/8178500580896771581/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2010/11/dpcm-differential-pulse-code-modulation.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8178500580896771581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8178500580896771581'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2010/11/dpcm-differential-pulse-code-modulation.html' title='DPCM (Differential Pulse Code Modulation), Método diferencial para compresión de señales, Parte I, puro rollo'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iCpJOoYu6qU/TPQRuM6lcHI/AAAAAAAAAcU/uGSHlfzcW3I/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-6951762342576447539</id><published>2009-10-06T21:45:00.001-06:00</published><updated>2009-10-06T21:54:11.980-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='wavelets'/><category scheme='http://www.blogger.com/atom/ns#' term='frames'/><category scheme='http://www.blogger.com/atom/ns#' term='wavelet'/><title type='text'>¿Qué Onda?: Fundamentos Matemáticos de las WAVELETS. Parte I</title><content type='html'>&lt;p&gt;Lo que se presenta a continuación es basado en un artículo de Albert Cohen y Jelena Kovacevic llamado &lt;em&gt;Wavelets: The Mathematical Background&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cuando se tiene una señal, existen una gran cantidad de maneras de representarla y en base a lo que necesitamos hacer con dicha señal es que elegimos la manera en que va a ser tratada. El objetivo es que la información obtenida de la señal tenga significado para nosotros, es ahí dónde se pueden lograr varios acercamientos. Entre ellos se encuentran la multiresolución y las transformaciones de dominio.&lt;/p&gt;  &lt;p&gt;La multiresolución a grandes rasgos es ir representando la información de manera que los detalles son agregados de forma sucesiva. Para la representación de una señal, uno de los temas que se utilizan ampliamente son las transformaciones de dominio y con ello es menester hablar una de las técnicas más aplicadas, la transformada de Fourier. Con la transformada de Fourier cambiamos la representación de una señal en el dominio del tiempo al dominio de la frecuencia, pero no podemos saber en que instante de tiempo está ubicada la frecuencia, esto es en algunos casos una limitación.&lt;/p&gt;  &lt;p&gt;Una manera de darnos una idea de la localización en tiempo de la frecuencia es construir bloques y aplicarles la transformada de Fourier. Si tenemos que &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOUOUV87I/AAAAAAAAAVA/tTWAl7m1ZRY/s1600-h/clip_image002%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOUgZo7iI/AAAAAAAAAVE/DNv1V9z77lg/clip_image002_thumb.gif?imgmax=800" width="25" height="21" /&gt;&lt;/a&gt; es una señal de frecuencia, con Fourier obtenemos un pico en la frecuencia &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOU9Y4lfI/AAAAAAAAAVI/VfDGT4BCQjg/s1600-h/clip_image004%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image004" border="0" alt="clip_image004" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOVkstniI/AAAAAAAAAVM/nzW2G2TkHnE/clip_image004_thumb.gif?imgmax=800" width="16" height="15" /&gt;&lt;/a&gt; dada. A partir de esto podemos expresar &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOWRfjz4I/AAAAAAAAAVQ/ULbK5IfuCdc/s1600-h/clip_image006%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image006" border="0" alt="clip_image006" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOW0gKjNI/AAAAAAAAAVU/iX7vVuFyNRs/clip_image006_thumb.gif?imgmax=800" width="75" height="24" /&gt;&lt;/a&gt; dónde &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOXEDZNMI/AAAAAAAAAVY/QOwwYMSqw1U/s1600-h/clip_image008%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image008" border="0" alt="clip_image008" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOXvI2dOI/AAAAAAAAAVc/-3jTDYxVyvQ/clip_image008_thumb.gif?imgmax=800" width="32" height="21" /&gt;&lt;/a&gt; es la ventana usada para localizar la frecuencia en el tiempo, a esto se le llama &lt;i&gt;Short-time Fourier Transform (STFT)&lt;/i&gt;. Una de las principales desventajas con la STFT es que la localización en el espacio tiempo es fija. Con las wavelets se tiene un acercamiento diferente, la localización de la frecuencia es logarítmica y proporcional al nivel de frecuencia.&lt;/p&gt;  &lt;p&gt;Se puede definir una familia de funciones de la siguiente manera que nos permita tener una representación en la escala del tiempo    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="391"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOX7BMAhI/AAAAAAAAAVg/4Q-yFPtmj0Q/s1600-h/clip_image010%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image010" border="0" alt="clip_image010" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOYn8jfMI/AAAAAAAAAVk/NucEA0_F62Q/clip_image010_thumb.gif?imgmax=800" width="147" height="45" /&gt;&lt;/a&gt;,&lt;/p&gt;         &lt;/td&gt;          &lt;td width="96"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOYw7EcwI/AAAAAAAAAVo/zGz57OWbi-E/s1600-h/clip_image012%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image012" border="0" alt="clip_image012" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOZVhetfI/AAAAAAAAAVs/i5isaboC-oQ/clip_image012_thumb.gif?imgmax=800" width="76" height="21" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;dónde &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOZokl9XI/AAAAAAAAAVw/vaEFG67n12U/s1600-h/clip_image014%5B4%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image014" border="0" alt="clip_image014" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOaLv3hGI/AAAAAAAAAV0/7rNLVjbCiMQ/clip_image014_thumb.gif?imgmax=800" width="16" height="17" /&gt;&lt;/a&gt; es una función fija llamada “&lt;i&gt;wavelet madre”&lt;/i&gt;, &lt;i&gt;a&lt;/i&gt; representa el escalamiento de la función y &lt;i&gt;b&lt;/i&gt; son los corrimientos en el tiempo.&lt;/p&gt;  &lt;p&gt;Basado en la función representada en (1) y tomando en cuenta que es un espacio de Hilbert, se define la transformada de una función &lt;i&gt;f&lt;/i&gt; de la siguiente manera:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOasTVysI/AAAAAAAAAV4/h1SPvZvQGBI/s1600-h/clip_image016%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image016" border="0" alt="clip_image016" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswObF9olRI/AAAAAAAAAV8/aFipsSMlVgc/clip_image016_thumb.gif?imgmax=800" width="268" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Para que la transformada (2) pueda ser invertible, se tiene elegir una &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswObZfZ5iI/AAAAAAAAAWA/xq5YJn9-H-c/s1600-h/clip_image014%5B1%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image014[1]" border="0" alt="clip_image014[1]" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOb0kuwhI/AAAAAAAAAWE/YWcdDgHJZm8/clip_image014%5B1%5D_thumb.gif?imgmax=800" width="16" height="17" /&gt;&lt;/a&gt; de manera que cumpla con la condición de admisibilidad mostrada a continuación:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOccB6wjI/AAAAAAAAAWI/RllLS1_henE/s1600-h/clip_image018%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image018" border="0" alt="clip_image018" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOcuTc-9I/AAAAAAAAAWM/HmNKCvNx9c0/clip_image018_thumb.gif?imgmax=800" width="144" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Y para asegurar que la integral es finita se debe cumplir que &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOdJHWYcI/AAAAAAAAAWQ/Q0g4bmvCGt8/s1600-h/clip_image020%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image020" border="0" alt="clip_image020" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOdvA0FsI/AAAAAAAAAWU/jVu_3w8zCfA/clip_image020_thumb.gif?imgmax=800" width="60" height="23" /&gt;&lt;/a&gt;. En base a lo anterior tenemos que se puede reconstruir mediante:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOd_9qZzI/AAAAAAAAAWY/XoLVQgvIBIM/s1600-h/clip_image022%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image022" border="0" alt="clip_image022" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOedTcFzI/AAAAAAAAAWc/GN-r7ptQtSQ/clip_image022_thumb.gif?imgmax=800" width="227" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Prácticamente, una transformada wavelet continua se aplica a una serie de puntos discretos de manera &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOehCEC4I/AAAAAAAAAWg/k7NdtLXR4Pc/s1600-h/clip_image024%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image024" border="0" alt="clip_image024" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOfPPSMXI/AAAAAAAAAWk/Cv7v06_wxzQ/clip_image024_thumb.gif?imgmax=800" width="67" height="24" /&gt;&lt;/a&gt;. Si se restringe la transformada continua wavelet de manera que &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOfXFd1YI/AAAAAAAAAWo/82HYflcswwM/s1600-h/clip_image026%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image026" border="0" alt="clip_image026" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOf5dHuVI/AAAAAAAAAWs/pcII_sxgxGg/clip_image026_thumb.gif?imgmax=800" width="93" height="25" /&gt;&lt;/a&gt;, dónde &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOge4WfqI/AAAAAAAAAWw/OrzQxdjOt_0/s1600-h/clip_image028%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image028" border="0" alt="clip_image028" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOgykBJkI/AAAAAAAAAW0/wk4CfjiUB6Q/clip_image028_thumb.gif?imgmax=800" width="57" height="21" /&gt;&lt;/a&gt;entonces para valores fijos &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOhUtu9aI/AAAAAAAAAW4/mqsu7M-nwIk/s1600-h/clip_image030%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image030" border="0" alt="clip_image030" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOh3Pp39I/AAAAAAAAAW8/Z6bEA5A6Mrc/clip_image030_thumb.gif?imgmax=800" width="41" height="24" /&gt;&lt;/a&gt; y &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOiUsPAUI/AAAAAAAAAXA/H_QMkbEnCrE/s1600-h/clip_image032%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image032" border="0" alt="clip_image032" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOi0Ft1eI/AAAAAAAAAXE/WX15Yp1GBL4/clip_image032_thumb.gif?imgmax=800" width="41" height="24" /&gt;&lt;/a&gt;. Entonces podemos definir la función wavelet de manera general cómo:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="391"&gt;           &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOjNzZ3lI/AAAAAAAAAXI/iaUXucIWPJY/s1600-h/clip_image034%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image034" border="0" alt="clip_image034" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOjj8Qc5I/AAAAAAAAAXM/ZRBRCs0gwpk/clip_image034_thumb.gif?imgmax=800" width="177" height="51" /&gt;&lt;/a&gt;,&lt;/p&gt;         &lt;/td&gt;          &lt;td width="96"&gt;           &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOkIq-5bI/AAAAAAAAAXQ/YCE1ZnY4iWM/s1600-h/clip_image036%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image036" border="0" alt="clip_image036" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOkacfheI/AAAAAAAAAXU/0ZrP-MoIVX0/clip_image036_thumb.gif?imgmax=800" width="44" height="24" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Para saber si la transformada wavelet en el caso discreto caracteriza completamente la función &lt;i&gt;f&lt;/i&gt; y logra reconstruirla de manera estable, se requiere introducir el concepto de &lt;i&gt;frames&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;Para que un &lt;i&gt;frame&lt;/i&gt; exista, y por lo tanto reconstrucción a partir de la wavelet, se debe tener una secuencia &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOkyBqiAI/AAAAAAAAAXY/HWTUDfpAM-U/s1600-h/clip_image038%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image038" border="0" alt="clip_image038" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOlbtokqI/AAAAAAAAAXc/RAaeNrHY_eI/clip_image038_thumb.gif?imgmax=800" width="45" height="24" /&gt;&lt;/a&gt;en un espacio de Hilbert &lt;i&gt;H&lt;/i&gt; si para cada &lt;i&gt;x&lt;/i&gt; perteneciente al espacio H se cumple lo siguiente:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOl0z0cuI/AAAAAAAAAXg/F84_piWVEZ0/s1600-h/clip_image040%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image040" border="0" alt="clip_image040" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOmOdBhWI/AAAAAAAAAXk/84D5nKemqtw/clip_image040_thumb.gif?imgmax=800" width="173" height="40" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(6)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;En dónde los límites &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOmiXHYVI/AAAAAAAAAXo/K2SxW2PJPEU/s1600-h/clip_image042%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image042" border="0" alt="clip_image042" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOnJs9jeI/AAAAAAAAAXs/-JK0QcZUUOo/clip_image042_thumb.gif?imgmax=800" width="65" height="19" /&gt;&lt;/a&gt; son independientes de &lt;i&gt;x&lt;/i&gt;. A dicha secuencia se le asocia al operador &lt;i&gt;F&lt;/i&gt; que representa a &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOnQMuKWI/AAAAAAAAAXw/kdtbIe1qAfk/s1600-h/clip_image044%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image044" border="0" alt="clip_image044" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOnzUs4JI/AAAAAAAAAX0/7XvINbErJMQ/clip_image044_thumb.gif?imgmax=800" width="69" height="27" /&gt;&lt;/a&gt;y también se desprende de ahí &lt;i&gt;F*&lt;/i&gt; que asocia la sumatoria de las secuencias &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOpLTAGlI/AAAAAAAAAX4/pnSnDi_g7aw/s1600-h/clip_image046%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image046" border="0" alt="clip_image046" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOpTjJz5I/AAAAAAAAAX8/BIOP7lYfa4o/clip_image046_thumb.gif?imgmax=800" width="45" height="24" /&gt;&lt;/a&gt; en &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOp4qBdLI/AAAAAAAAAYA/UNO-r9I3LFI/s1600-h/clip_image048%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image048" border="0" alt="clip_image048" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOqk1kKCI/AAAAAAAAAYE/cqS_4-EcG04/clip_image048_thumb.gif?imgmax=800" width="92" height="28" /&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La desigualdad expresada en (6) puede ser expresada en términos del operador hermitiano &lt;i&gt;F* F&lt;/i&gt; de manera que:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOq2oVHHI/AAAAAAAAAYI/1qJ3YM0SLEQ/s1600-h/clip_image050%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image050" border="0" alt="clip_image050" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOrGC_XeI/AAAAAAAAAYM/_UZsxR5SZak/clip_image050_thumb.gif?imgmax=800" width="116" height="21" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(7)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;En base a lo anterior podemos definir una secuencia &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOroudlvI/AAAAAAAAAYQ/6uNbL0O25GY/s1600-h/clip_image052%5B4%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image052" border="0" alt="clip_image052" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOsep0LJI/AAAAAAAAAYU/Tn1r-sYeY9c/clip_image052_thumb.gif?imgmax=800" width="44" height="24" /&gt;&lt;/a&gt; dada por &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOsyvWNKI/AAAAAAAAAYY/nYOEUj3pQPA/s1600-h/clip_image054%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image054" border="0" alt="clip_image054" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOtTroyFI/AAAAAAAAAYc/wcznDmLa8n0/clip_image054_thumb.gif?imgmax=800" width="95" height="29" /&gt;&lt;/a&gt; que también constituye un &lt;i&gt;frame&lt;/i&gt; llamado &lt;i&gt;dual frame&lt;/i&gt; con límites en &lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOt6R-rBI/AAAAAAAAAYg/LB0Ou4ZDEaA/s1600-h/clip_image056%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image056" border="0" alt="clip_image056" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOuW-FWdI/AAAAAAAAAYk/AYSt1eb6QhM/clip_image056_thumb.gif?imgmax=800" width="88" height="21" /&gt;&lt;/a&gt; y se asocia con el operador llamado &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOuiwlfyI/AAAAAAAAAYo/D0pgHrQVIc0/s1600-h/clip_image058%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image058" border="0" alt="clip_image058" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOvYg1CuI/AAAAAAAAAYs/_PuHXhItSsU/clip_image058_thumb.gif?imgmax=800" width="21" height="21" /&gt;&lt;/a&gt; por lo consiguiente tenemos que:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SswOvhs7VfI/AAAAAAAAAYw/6QyMXc6YYbQ/s1600-h/clip_image060%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image060" border="0" alt="clip_image060" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOwYxXgDI/AAAAAAAAAY0/PpA6Or0ctj4/clip_image060_thumb.gif?imgmax=800" width="269" height="31" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(8)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Y también tenemos que &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOwxxISwI/AAAAAAAAAY4/ntC_HKwK2ZQ/s1600-h/clip_image062%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image062" border="0" alt="clip_image062" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOxhkA7tI/AAAAAAAAAY8/xLLXTs-s6Eo/clip_image062_thumb.gif?imgmax=800" width="65" height="23" /&gt;&lt;/a&gt; así que una &lt;i&gt;x&lt;/i&gt; que forma parte del espacio de Hilbert es representada por:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOyF58N3I/AAAAAAAAAZA/q4lMDSywcg8/s1600-h/clip_image064%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image064" border="0" alt="clip_image064" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswOyWCFQMI/AAAAAAAAAZE/Zn63kmoM2j4/clip_image064_thumb.gif?imgmax=800" width="185" height="36" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(9)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Para reconstruir &lt;i&gt;x&lt;/i&gt; debemos conocer &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOyyrxfFI/AAAAAAAAAZI/UwbtYmmFPSQ/s1600-h/clip_image052%5B1%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image052[1]" border="0" alt="clip_image052[1]" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOzHk_5NI/AAAAAAAAAZM/0TuLPY46Zds/clip_image052%5B1%5D_thumb.gif?imgmax=800" width="44" height="24" /&gt;&lt;/a&gt;. Teniendo en cuenta que:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswOzhWieeI/AAAAAAAAAZQ/fR5D4kn7eN4/s1600-h/clip_image066%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image066" border="0" alt="clip_image066" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswOz6QYwsI/AAAAAAAAAZU/VRqs1hVAziI/clip_image066_thumb.gif?imgmax=800" width="143" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(10)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Dónde el operador residual &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswO0Zc_wwI/AAAAAAAAAZY/j1mH9RNCJF8/s1600-h/clip_image068%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image068" border="0" alt="clip_image068" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswO08l_xUI/AAAAAAAAAZc/kjem7c697o0/clip_image068_thumb.gif?imgmax=800" width="143" height="21" /&gt;&lt;/a&gt; satisface lo siguiente:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SswO1EDUzAI/AAAAAAAAAZg/d0v7cp4EjLY/s1600-h/clip_image070%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image070" border="0" alt="clip_image070" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswO1kmQf1I/AAAAAAAAAZk/XX3A0OvPcRE/clip_image070_thumb.gif?imgmax=800" width="100" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(11)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Sustituyendo en (7) nos da como resultado la siguiente ecuación:    &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SswO1_RPUWI/AAAAAAAAAZo/SywglmxBo2o/s1600-h/clip_image072%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image072" border="0" alt="clip_image072" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SswO2W5Ou2I/AAAAAAAAAZs/gCT_YTq2T2Q/clip_image072_thumb.gif?imgmax=800" width="212" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(12)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Si tenemos que &lt;i&gt;A=B=1&lt;/i&gt; después de renormalizar, entonces podemos definir lo siguiente:     &lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td width="487"&gt;           &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SswO29bUAGI/AAAAAAAAAZw/MiqxuGxCPaI/s1600-h/clip_image074%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image074" border="0" alt="clip_image074" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SswO3Ud5nfI/AAAAAAAAAZ0/UmsK5XD01_4/clip_image074_thumb.gif?imgmax=800" width="136" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td width="103"&gt;           &lt;p&gt;&lt;b&gt;(13)&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;De manera que elegimos valores de &lt;i&gt;A-B/A+B&lt;/i&gt; que se aproximan a cero y también &lt;i&gt;A&lt;/i&gt; y &lt;i&gt;B&lt;/i&gt; de manera arbitraria cercanos a uno seguido de una renormalización, eligiendo valores &lt;i&gt;a&lt;sub&gt;0&lt;/sub&gt;&lt;/i&gt; y &lt;i&gt;b&lt;sub&gt;0&lt;/sub&gt;&lt;/i&gt; cercanos a uno y cero respectivamente. Lo anterior significa que se ha hecho un sobre-muestreo de la wavelet continua en un arreglo bastante denso. Una de las aplicaciones más usadas para usar el sobre-muestreo empleando &lt;i&gt;frames&lt;/i&gt; es el de reducir el error de reconstrucción con una relación basada en el sobre-muestreo.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Continuará…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-6951762342576447539?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/6951762342576447539/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/10/que-onda-fundamentos-matematicos-de-las.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/6951762342576447539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/6951762342576447539'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/10/que-onda-fundamentos-matematicos-de-las.html' title='¿Qué Onda?: Fundamentos Matemáticos de las WAVELETS. Parte I'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iCpJOoYu6qU/SswOUgZo7iI/AAAAAAAAAVE/DNv1V9z77lg/s72-c/clip_image002_thumb.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-4604233670112145661</id><published>2009-10-02T07:25:00.002-06:00</published><updated>2009-10-02T07:27:51.906-06:00</updated><title type='text'>MEMORIA</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style=" font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;NO SE OLVIDA&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-4604233670112145661?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/4604233670112145661/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/10/memoria.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4604233670112145661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4604233670112145661'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/10/memoria.html' title='MEMORIA'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1658968663348739461</id><published>2009-09-24T02:59:00.001-06:00</published><updated>2009-09-24T03:02:32.981-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wavedemo'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='wavelet'/><title type='text'>wavedemo: Herramienta didáctica en MATLAB para wavelets. Ejemplo para descomponer una imagen paso a paso</title><content type='html'>&lt;p&gt;En este post no voy a hablar de la teoría de las wavelets, eso ya tocará en otra ocasión. Buscando desesperadamente información cuando estaba tratando de entender el “image denoising” usando wavelets, me tope con este demo que trae incluido del toolbox de wavelets en MATLAB. Aquí pongo un ejemplo muy simple para ver como se realiza una transformada wavelet aplicada a una imagen.&lt;/p&gt;  &lt;p&gt;Primero se tiene que cargar el demo, simple y sencillamente poniendo lo siguiente en la línea de comandos:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;wavedemo&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;y aparece a continuación la siguiente ventana &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/Srs02urzJXI/AAAAAAAAATQ/29aQvVtQ1AQ/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/Srs03Cl7IRI/AAAAAAAAATU/CmmsTiwanCE/image_thumb.png?imgmax=800" width="228" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Como se muestra en la imagen anterior, se tienen tres opciones, la primera es un buen ejemplo para mostrar los comandos utilizados a bajo nivel por MATLAB para realizar la transformada wavelet de manera secuencial. En este ejemplo presionamos el botón que dice: &lt;strong&gt;“Command line mode” &lt;/strong&gt;y nos muestra la siguiente ventana&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/Srs04CUPGuI/AAAAAAAAATY/mZD-XYQmou8/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/Srs04hjZauI/AAAAAAAAATc/YmEIYrBfvZc/image_thumb%5B1%5D.png?imgmax=800" width="268" height="485" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;como se puede observar, cuenta con varios ejemplos aplicando la transformada wavelet, continuamos presionando el botón que dice &lt;strong&gt;“Wavelet 2-D”&lt;/strong&gt; y nos muestra la siguiente pantalla&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/Srs05XULQ3I/AAAAAAAAAUA/SRI6IrLlo_0/s1600-h/image%5B18%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/Srs06QnnRnI/AAAAAAAAAUE/IMyrjtVXMcE/image_thumb%5B6%5D.png?imgmax=800" width="491" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Es importante notar en donde dice &lt;strong&gt;Image&lt;/strong&gt;, obviamente se selecciona la imagen que queremos mostrar en el ejemplo, y presionamos &lt;strong&gt;“Start &amp;gt;&amp;gt;”&lt;/strong&gt; para ir paso a paso o &lt;strong&gt;“AutoPlay”&lt;/strong&gt; para que lo reproduzca automáticamente.&lt;/p&gt;  &lt;p&gt;A continuación se muestran algunos de los pasos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/Srs073_h5fI/AAAAAAAAAUQ/20F6SCBmwoM/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_iCpJOoYu6qU/Srs09HJDTHI/AAAAAAAAAUY/rWoynPTLmig/image_thumb%5B7%5D.png?imgmax=800" width="491" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/Srs0-jfRqzI/AAAAAAAAAUg/e1woJ71cnws/s1600-h/image%5B20%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/Srs0_wU2h9I/AAAAAAAAAUo/TxiW-PxiBmw/image_thumb%5B8%5D.png?imgmax=800" width="491" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/Srs1BfIXO6I/AAAAAAAAAUw/cE7dHi5CAKc/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iCpJOoYu6qU/Srs1CW-1NzI/AAAAAAAAAU4/_bul4_VGeNo/image_thumb%5B9%5D.png?imgmax=800" width="491" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1658968663348739461?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1658968663348739461/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/09/wavedemo-herramienta-didactica-en.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1658968663348739461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1658968663348739461'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/09/wavedemo-herramienta-didactica-en.html' title='wavedemo: Herramienta didáctica en MATLAB para wavelets. Ejemplo para descomponer una imagen paso a paso'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iCpJOoYu6qU/Srs03Cl7IRI/AAAAAAAAATU/CmmsTiwanCE/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-8416392048806769182</id><published>2009-09-04T09:56:00.004-06:00</published><updated>2009-09-04T11:03:15.491-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='México Lee 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Premio Nacional de Fomento a la Lectura'/><title type='text'>¡GANADORAS!</title><content type='html'>&lt;div style="text-align: justify;"&gt;Escribo en celebración de una memorable ocasión, ahora si es oficial el anuncio.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si, nuestras cuenta cuentos urbanas, (&lt;a href="http://palabrasdarena.blogspot.com/"&gt;por si no han visto el link allá arriba&lt;/a&gt;) han sido ganadoras ni más ni menos del Premio al Fomento de la Lectura "México lee 2009", pueden ver la nota oficial &lt;a href="http://www.conaculta.gob.mx/?p=24624"&gt;aquí&lt;/a&gt;. Y la semana que entra estará en representación del colectivo Ivonne en el palacio de Chapultepec, en México D.F. para asistir al Primer Encuentro Internacional de Salas de Lectura en el cual se llevará a cabo la premiación.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A continuación transcribo un fragmento de la nota oficial, claro donde se anuncia a nuestras ganadoras:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); font-family:Verdana, serif;font-size:11px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); font-family:Verdana, serif;font-size:11px;"&gt;En la categoría de &lt;em&gt;Fomento de la lectura desde la sociedad civil&lt;/em&gt;, el jurado, integrado por la promotora y capacitadora Carola Díez, el profesor Amílcar Saavedra y el especialista en promoción de la lectura Rubén Pérez Buendía eligió como ganadora a Ivonne Ramírez Ramírez, de Ciudad Juárez, Chihuahua, representante del Colectivo Palabras de Arena, con el trabajo &lt;em&gt;Regalando palabras en el desierto: cuentacuentos urbanos entre maquiladoras y narcofosas&lt;/em&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"    style="font-family:Verdana, serif;font-size:100%;color:#333333;"&gt;&lt;span class="Apple-style-span"  style="font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Nuevamente, cómo dice Mr. Cómic Man y se ha convertido en frase célebre local: &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;"Esa es la actitud"&lt;/b&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span"  style="color:#CC33CC;"&gt;¡Felicidades PuentaPuentos Urbanas!&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-8416392048806769182?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/8416392048806769182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/09/ganadoras.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8416392048806769182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8416392048806769182'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/09/ganadoras.html' title='¡GANADORAS!'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3676548946160226760</id><published>2009-08-30T20:31:00.001-06:00</published><updated>2009-08-30T20:31:43.457-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freqz'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='FIR'/><category scheme='http://www.blogger.com/atom/ns#' term='zplane'/><category scheme='http://www.blogger.com/atom/ns#' term='Filtros'/><title type='text'>Graficar la respuesta a la frecuencia y los polos y ceros de un filtro FIR en MATLAB</title><content type='html'>&lt;p&gt;En este ejemplo se grafican los filtros que vienen como ejemplo en el post anterior: &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/08/que-es-un-filtro-de-respuesta-finita.html"&gt;¿Qué es un filtro de respuesta finita? (FIR:Finite impulse Response). Un ejemplo.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si tenemos un filtro como se muestra a continuación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/Sps14XpEtnI/AAAAAAAAARc/_9P7bCsWW-Q/s1600-h/clip_image002%5B4%5D%5B6%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh3.ggpht.com/_iCpJOoYu6qU/Sps15avyTLI/AAAAAAAAARg/_l8Vz61cGDM/clip_image002%5B4%5D_thumb%5B4%5D.gif?imgmax=800" width="99" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo podemos graficar en MATLAB con el siguiente código:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;RaizDeDos = 2^(1/2);     &lt;br /&gt;h = [1/RaizDeDos 1/RaizDeDos];      &lt;br /&gt;freqz(h,1);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;La función freqz ejecutada de la manera anterior nos regresa una ventana con la siguiente información:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/Sps16vugJrI/AAAAAAAAARk/F1nkCv6Kwag/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_iCpJOoYu6qU/Sps18CuE3ZI/AAAAAAAAARo/qbR5-pP_jaE/image_thumb%5B1%5D.png?imgmax=800" width="545" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Como se puede observar nos regresa la magnitud y la fase del filtro, pero solo nos muestra hasta pi, para graficar la respuesta de 2pi, tenemos que hacerlo de la siguiente manera:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;RaizDeDos = 2^(1/2);     &lt;br /&gt;h = [1/RaizDeDos 1/RaizDeDos];      &lt;br /&gt;freqz(h,1,'whole');&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Si, es de la misma manera, simplemente&amp;#160; se le agrega ‘whole’ a la función freqz. Para mas información simple y sencillamente teclear &lt;em&gt;doc freqz&lt;/em&gt; para acceder a la documentación de MATLAB. La respuesta a la frecuencia queda como a continuación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/Sps19Ve9vBI/AAAAAAAAARs/5OwtiEo21gA/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/Sps1-sA_AVI/AAAAAAAAARw/4WuJsrpdQ2o/image_thumb%5B3%5D.png?imgmax=800" width="545" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Para graficar los polos y ceros del filtro, el código en MATLAB es de la siguiente manera:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;RaizDeDos = 2^(1/2);     &lt;br /&gt;h = [1/RaizDeDos 1/RaizDeDos];      &lt;br /&gt;z = roots(h);      &lt;br /&gt;zplane(z',1);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Como se observa, primero se tienen que calcular las raíces de h, ya que tenemos que &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/Sps1_AFf36I/AAAAAAAAAR0/PA1ck-Q7_P0/s1600-h/clip_image002%5B6%5D%5B2%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002[6]" border="0" alt="clip_image002[6]" src="http://lh6.ggpht.com/_iCpJOoYu6qU/Sps1_-23eFI/AAAAAAAAAR4/3SMz2KxnheM/clip_image002%5B6%5D_thumb.gif?imgmax=800" width="117" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;y &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/Sps2APeA1vI/AAAAAAAAAR8/4hYBPCawaos/s1600-h/clip_image002%5B8%5D%5B2%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002[8]" border="0" alt="clip_image002[8]" src="http://lh4.ggpht.com/_iCpJOoYu6qU/Sps2BXJ7tGI/AAAAAAAAASA/tPT05CXRoF8/clip_image002%5B8%5D_thumb.gif?imgmax=800" width="133" height="44" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Así que para calcular los ceros tenemos que calcular las raíces de z en h, por eso la línea &lt;em&gt;z=roots(h);&lt;/em&gt; y como nos regresa un vector columna, ponemos la transpuesta en la función zplane. La gráfica quedaría como se muestra a continuación:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/Sps2CU2N-GI/AAAAAAAAASE/k0kzGPfyK3o/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_iCpJOoYu6qU/Sps2DdOsUPI/AAAAAAAAASI/TB3MZzFttVg/image_thumb%5B5%5D.png?imgmax=800" width="545" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Si, es simple como eso, pero para poder llegar a eso tuve que pelearme un buen rato con MATLAB, por eso es que aquí lo pongo, jeje.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:095ddc1a-3c48-4425-8349-3d9e6a4407f4" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MATLAB" rel="tag"&gt;MATLAB&lt;/a&gt;,&lt;a href="http://technorati.com/tags/FIR" rel="tag"&gt;FIR&lt;/a&gt;,&lt;a href="http://technorati.com/tags/zplane" rel="tag"&gt;zplane&lt;/a&gt;,&lt;a href="http://technorati.com/tags/freqz" rel="tag"&gt;freqz&lt;/a&gt;,&lt;a href="http://technorati.com/tags/filtros" rel="tag"&gt;filtros&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3676548946160226760?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3676548946160226760/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/08/graficar-la-respuesta-la-frecuencia-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3676548946160226760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3676548946160226760'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/08/graficar-la-respuesta-la-frecuencia-y.html' title='Graficar la respuesta a la frecuencia y los polos y ceros de un filtro FIR en MATLAB'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iCpJOoYu6qU/Sps15avyTLI/AAAAAAAAARg/_l8Vz61cGDM/s72-c/clip_image002%5B4%5D_thumb%5B4%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-4766021023635037131</id><published>2009-08-24T21:43:00.001-06:00</published><updated>2009-08-26T10:14:29.926-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Mythology'/><category scheme='http://www.blogger.com/atom/ns#' term='656 Comics'/><category scheme='http://www.blogger.com/atom/ns#' term='Infestación'/><title type='text'>¡Santas pandemias Bacman!</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SpNd1OpVbiI/AAAAAAAAAQg/-T3drA7Q_mc/s1600-h/Poster%5B10%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Poster" border="0" alt="Poster" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SpNd4CmpPmI/AAAAAAAAAQk/B4N-iUu_ZHY/Poster_thumb%5B8%5D.png?imgmax=800" width="326" height="480" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hay cosas que no se pueden definir con la rigurosidad científica que en más de un par de ocasiones embarga este espacio, como por ejemplo el explicar invasiones de seres putrefactos y hambrientos y es por eso que los expertos en la materia se encargan de ello, este es un buen ejemplo. &lt;/p&gt;  &lt;p&gt;Infestación es la obra de un grupo de comiqueros en el borderland juarezpaseño y áreas circunvecinas. Ya tienen un buen rato haciendo monitos por estos lados y a primera vista se aprecia el resultado de su excelente jale. Es un orgullo ver el nacimiento de este pequeño insecto y esperemos que pronto se pueda ver infectando por doquier.&lt;/p&gt;  &lt;p&gt;Bueno no me podía quedar así y pues ahí les van unos cuantos datos cuantizados de esta obra:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;- 370 páginas&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 16 historias&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 2 países&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 3 escritores&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 8 dibujantes&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 6+ Artistas invitados&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 1era edición&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- 07/2009&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- ISBN: 978-0-578-03442-3&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;- Portada a Colores&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Resto a escala de grises&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://656comics2.blogspot.com"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Loguito" border="0" alt="Loguito" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SpNd45ekZ0I/AAAAAAAAAQo/n_xK3E2NhpM/Loguito%5B6%5D.png?imgmax=800" width="301" height="139" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Para más información pues, dense una vuelta por el blog oficial de los &lt;a target="_blank" href="http://656comics2.blogspot.com/"&gt;seis cinco seis&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:020ea703-807a-457d-9d34-67a3dc291f05" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/656+Comics" rel="tag"&gt;656 Comics&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Infestaci%c3%b3n+the+mythology" rel="tag"&gt;Infestaci&amp;#243;n the mythology&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0756623c-e993-4b09-8988-08441b46ebf2" class="wlWriterEditableSmartContent"&gt;BuzzNet Tags: &lt;a href="http://www.buzznet.com/tags/656+Comics" rel="tag"&gt;656 Comics&lt;/a&gt;,&lt;a href="http://www.buzznet.com/tags/Infestaci%c3%b3n+the+mythology" rel="tag"&gt;Infestaci&amp;#243;n the mythology&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-4766021023635037131?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/4766021023635037131/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/08/santas-pandemias-bacman.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4766021023635037131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4766021023635037131'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/08/santas-pandemias-bacman.html' title='¡Santas pandemias Bacman!'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iCpJOoYu6qU/SpNd4CmpPmI/AAAAAAAAAQk/B4N-iUu_ZHY/s72-c/Poster_thumb%5B8%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3730588103176004307</id><published>2009-08-10T21:37:00.000-06:00</published><updated>2009-08-10T21:37:37.925-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='FIR'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><title type='text'>¿Qué es un filtro de respuesta finita? (FIR:Finite impulse Response). un ejemplo.</title><content type='html'>&lt;p align="justify"&gt;Este post trata sobre un ejemplo tomado del Libro: &lt;a target="_blank" href="http://www.amazon.com/Processing-Wavelets-Electrical-Engineering-Computer/dp/0977858200"&gt;Digital Signal Processing Using MATLAB and Wavelets&lt;/a&gt;, de Michael Weeks, Capítulo 3.&lt;/p&gt;  &lt;p align="justify"&gt;Básicamente, existen principalmente tres tipos de filtros: &lt;em&gt;pasabajas&lt;/em&gt; que dejan pasar solamente bajas frecuencias; &lt;em&gt;pasaaltas&lt;/em&gt; que dejan pasar altas frecuencias y &lt;em&gt;pasabanda&lt;/em&gt; que permiten el paso de todo el espectro, no es menester de este ejemplo el explicar en teoría que es un filtro (eso tomaría demasiado) ni tratar el diseño de los mismos (eso tomaría aún más).&lt;/p&gt;  &lt;p align="justify"&gt;El nombre FIR viene de la manera en que el filtro afecta una señal. Una función impulso es una entrada bastante interesante, donde la señal es 0 siempre, excepto en un lugar donde tiene valor de 1 (una unidad). Se llama también &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Dirac_delta_function"&gt;delta Dirac&lt;/a&gt; en tiempo continuo y &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Kronecker_delta"&gt;delta Kronecker&lt;/a&gt; en discreto (shhh!). La respuesta de un filtro FIR a esta entrada es de duración finita, y por lo consiguiente se le da este nombre.&lt;/p&gt;  &lt;p align="justify"&gt;Suponiendo que la Figura 1 tiene una entrada x[n] = [1,0]. La salida sería [0.5,0.5], y cero después de eso. Se pueden obtener estas salidas aplicándolas en orden a la estructura del filtro. En el tiempo 0, x[0] aparece en la entrada, y cualquier cosa antes de esto es cero, que es lo que el elemento &lt;em&gt;delay &lt;/em&gt;producirá como salida. En el siguiente intervalo de tiempo x[0] será la salida del &lt;em&gt;delay&lt;/em&gt; mientras que x[1] será la entrada actual.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SoDjOQ7fo-I/AAAAAAAAAQI/1gQXtKPp1Yg/s1600-h/EjemploFIRDiagrama18.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="EjemploFIRDiagrama" border="0" alt="EjemploFIRDiagrama" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SoDjO0TmXHI/AAAAAAAAAQM/2NmSCDtEGlk/EjemploFIRDiagrama_thumb16.png?imgmax=800" width="407" height="233" /&gt;&lt;/a&gt;&lt;strong&gt; Figura 1: Filtro FIR con coeficientes {0.5,0.5}&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;¿Cómo se expresa y[n] en forma de ecuación? Como se observa de calcular y[0] y y[1], se tiene exactamente el mismo patrón:&lt;/p&gt;  &lt;p align="center"&gt;y[0] = 0.5x[0] + 0.5x[-1]&lt;/p&gt;  &lt;p align="center"&gt;y[1] = 0.5x[1] + 0.5x[0]&lt;/p&gt;  &lt;p&gt;esto se generaliza como:&lt;/p&gt;  &lt;p align="center"&gt;y[n] = 0.5x[n] + 0.5x[n-1]&lt;/p&gt;  &lt;p align="justify"&gt;La Figura 2 muestra la forma general de un filtro FIR, para K+1 coeficientes (son K+1, porque se empieza en 0 y se cuenta hasta K). El número de coeficientes también es llamado &lt;em&gt;taps. &lt;/em&gt;Por convención el número de &lt;em&gt;taps &lt;/em&gt;es igual al número de coeficientes. Así que un filtro con coeficientes {b0, b1, …, bK} tiene K+1 &lt;em&gt;taps&lt;/em&gt;, debido a que tiene K+1 coeficientes. De todas maneras se dice que el orden es K. En otras palabras el orden del filtro y los &lt;em&gt;taps&lt;/em&gt; expresan lo mismo pero con diferencia de 1.&lt;/p&gt;  &lt;p align="left"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SoDjPsBT2PI/AAAAAAAAAQQ/6eoD0h9TXHc/s1600-h/FormageneraldeunFiltroFIR8.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Forma general de un Filtro FIR" border="0" alt="Forma general de un Filtro FIR" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SoDjQUxSLEI/AAAAAAAAAQU/xBf9DzwyDNM/FormageneraldeunFiltroFIR_thumb6.png?imgmax=800" width="506" height="500" /&gt;&lt;/a&gt;&lt;strong&gt; Figura 2: Forma generalizada de un Filtro FIR&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Con la estructura de la Figura 2 es posible determinar la salida. También es posible determinar la ecuación de la salida, la cual es:&lt;/p&gt;  &lt;p align="center"&gt;y[n] = b[0]x[n-0] + b[1]x[n-1] + b[2]x[n-2] + … + b[K]x[n-K]&lt;/p&gt;  &lt;p align="justify"&gt;Nótese que para cualquier índice que se usa para b[.] es usado en x[n-.]. Esto significa que podemos representar todo lo que se encuentra al lado derecho de la ecuación como una sumatoria:&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SoDjQ5cXt0I/AAAAAAAAAQY/uKhQYoI35Aw/s1600-h/FIRgeneralizationFormula4.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="FIRgeneralizationFormula" border="0" alt="FIRgeneralizationFormula" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SoDjRdxsGaI/AAAAAAAAAQc/97xjYmN_yKM/FIRgeneralizationFormula_thumb2.png?imgmax=800" width="219" height="79" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;¡Hey!, eso parece como una &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Convolution"&gt;convolución&lt;/a&gt;, ¿no es así?&lt;/p&gt;  &lt;p align="justify"&gt;Un filtro &lt;em&gt;pasabajas&lt;/em&gt;, puede llamarse también filtro &lt;em&gt;promediador&lt;/em&gt;, mientras que un &lt;em&gt;pasaaltas&lt;/em&gt;, puede ser llamado filtro &lt;em&gt;diferenciador&lt;/em&gt;, debido a que estos términos describen el funcionamiento de los filtros. &lt;/p&gt;  &lt;p align="justify"&gt;Por ejemplo, un filtro FIR con dos coeficientes de 0.5 y 0.5, se observa que la salida es:&lt;/p&gt;  &lt;p align="center"&gt;y[n] = 0.5x[n] + 0.5x[n-1], o equivalentemente y[n]=(x[n]+x[n-1])/2&lt;/p&gt;  &lt;p align="justify"&gt;dicha salida, encuentra el promedio entre la entrada actual y la anterior. Si se observa la respuesta a la frecuencia de dicho filtro, se observa que las partes de bajas frecuencias (cambian lentamente) aparecen en la salida, mientras que el filtro decrementa las partes de altas frecuencias (cambian rápidamente). &lt;/p&gt;  &lt;p align="justify"&gt;Para el filtro de diferencias, se pueden tener coeficientes de {0.5 , –0.5} donde:&lt;/p&gt;  &lt;p align="center"&gt;y[n]=(x[n]-x[n-1])/2&lt;/p&gt;  &lt;p align="justify"&gt;Esto da el cambio entre las dos muestras, escalado por 1/2 para ser consistente con el filtro de promedios. Como es de esperarse, la respuesta a la frecuencia de dicho filtro, debe atenuar las partes de cambios lentos en la señal, y enfatizar la parte que cambia rápidamente, concluyendo que es un filtro &lt;em&gt;pasaaltas&lt;/em&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3730588103176004307?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3730588103176004307/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/08/que-es-un-filtro-de-respuesta-finita.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3730588103176004307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3730588103176004307'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/08/que-es-un-filtro-de-respuesta-finita.html' title='¿Qué es un filtro de respuesta finita? (FIR:Finite impulse Response). un ejemplo.'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iCpJOoYu6qU/SoDjO0TmXHI/AAAAAAAAAQM/2NmSCDtEGlk/s72-c/EjemploFIRDiagrama_thumb16.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1122060217198682373</id><published>2009-08-10T21:35:00.001-06:00</published><updated>2009-08-10T21:35:12.385-06:00</updated><title type='text'>WTF</title><content type='html'>The &lt;em&gt;pseudomathematicalgeek&lt;/em&gt; Joke of the day...   &lt;blockquote&gt;   &lt;p&gt;- How do you say that! It’s not allowed here.&lt;/p&gt;    &lt;p&gt;- Easy, easy, let me explain to you what it means.&lt;/p&gt;    &lt;p&gt;- It better be true!&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;W&lt;/strong&gt;avelet &lt;strong&gt;T&lt;/strong&gt;ransform&lt;/p&gt;    &lt;p&gt;- And the &lt;strong&gt;F&lt;/strong&gt;?&lt;/p&gt;    &lt;p&gt;- Nah!, that is just for &lt;strong&gt;F&lt;/strong&gt;un…&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1122060217198682373?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1122060217198682373/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/08/wtf.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1122060217198682373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1122060217198682373'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/08/wtf.html' title='WTF'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-7342985393773993698</id><published>2009-08-05T20:53:00.000-06:00</published><updated>2009-08-05T20:53:47.114-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='PGM'/><title type='text'>Ejemplo para leer una imagen PGM en Visual Basic 6.0</title><content type='html'>&lt;p align="justify"&gt;En el mundo de los programadores de software, Visual Basic no sirve para nada, je je, y para un par de cosas es cierto, pero para el resto, no. Déjenme explicarme un poco en esto. Visual Basic es un lenguaje desarrollado para hacer aplicaciones rápidas, en pocas palabras es un RAD (Rapid Application Development) como a los geeks de IBM los 80's les gusto llamarle. &lt;/p&gt;  &lt;p align="justify"&gt;Así que por ende, debe tener unas cosas por otras, es un lenguaje hasta cierto punto fácil de aprender y puedes desarrollar interfaces graficas de tres patadas, pero, pierdes un poco de control sobre la programación así que nada en cuestiones como programación orientada a objetos y apuntadores), conste no es solo esto, si no una lista que desconozco y tampoco necesito conocer. Otra de las desventajas es la lentitud para ejecutar los programas. Esta última es muy notable si lo comparamos con lenguajes un tanto más específicos para el procesamiento digital de imágenes, como por ejemplo MATLAB, o hasta LabVIEW. &lt;/p&gt;  &lt;p align="justify"&gt;Dejando de lado un poco el rollo, este ejemplo lo iniciaremos haciendo la interfaz gráfica de nuestro ejemplito, en una forma de Visual Basic, no iniciaré desde la creación del proyecto para no volver este post muy largo como el ejemplo de GUIDE. Primero ponemos un PictureBox y un CommandButton, el primero lo dejé con el nombre que le pone por default VB &lt;strong&gt;Picture1&lt;/strong&gt; y el segundo le puse &lt;strong&gt;cmdLoadPGM&lt;/strong&gt; y le cambié el &lt;em&gt;caption&lt;/em&gt; a “Cargar PGM” &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/Sni7QLgcbcI/AAAAAAAAAP0/p827_bRCs14/s1600-h/GUI1.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="GUI" border="0" alt="GUI" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SjaGTA1ySaI/AAAAAAAAAP4/obFkV78FzvY/GUI_thumb.png?imgmax=800" width="539" height="329" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La siguiente función es la que se encarga de leer el archivo PGM de la PC, y lo despliega en el Picturebox que le pasamos como parámetro: &lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; LoadPGMtoPictureBox(strPGMpath &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, myPictureBox &lt;span class="kwrd"&gt;As&lt;/span&gt; PictureBox)&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; bytes() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; pFileLenght &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iWidth &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iHeight &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; i &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; j &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iCountZeros &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iCounter &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; strCatchWidth &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; strCatchHeight &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; pFileLength &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; ptrToBytes &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Const&lt;/span&gt; PGM_MAGIC_NUMBER = &lt;span class="str"&gt;&amp;quot;P5&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; u &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; u2 &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Long&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    pFileLength = FileLen(strPGMpath)&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;ReDim&lt;/span&gt; bytes(1 &lt;span class="kwrd"&gt;To&lt;/span&gt; pFileLength)&lt;br /&gt;    &lt;br /&gt;    Open strPGMpath &lt;span class="kwrd"&gt;For&lt;/span&gt; Binary Access Read &lt;span class="kwrd"&gt;As&lt;/span&gt; #10&lt;br /&gt;    &lt;br /&gt;        &lt;span class="kwrd"&gt;Get&lt;/span&gt; #10, 1, bytes&lt;br /&gt;    &lt;br /&gt;    Close #10&lt;br /&gt;        &lt;br /&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; Chr(bytes(1)) &amp;amp; Chr(bytes(2)) = PGM_MAGIC_NUMBER &lt;span class="kwrd"&gt;Then&lt;/span&gt; _&lt;br /&gt;	&lt;br /&gt;        &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    iCountZeros = 0&lt;br /&gt;    iCounter = 4&lt;br /&gt;    strCatchWidth = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;    strCatchHeight = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;Do&lt;/span&gt;&lt;br /&gt;        strCatchWidth = strCatchWidth &amp;amp; Chr(bytes(iCounter))&lt;br /&gt;        iCounter = iCounter + 1&lt;br /&gt;    &lt;span class="kwrd"&gt;Loop&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt; IsNumeric(Chr(bytes(iCounter)))&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;Do&lt;/span&gt;&lt;br /&gt;        strCatchHeight = strCatchHeight &amp;amp; Chr(bytes(iCounter))&lt;br /&gt;        iCounter = iCounter + 1&lt;br /&gt;    &lt;span class="kwrd"&gt;Loop&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt; IsNumeric(Chr(bytes(iCounter)))&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    iWidth = &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(strCatchWidth)&lt;br /&gt;    iHeight = &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(strCatchHeight)&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; iHeight - 1&lt;br /&gt;        &lt;span class="kwrd"&gt;For&lt;/span&gt; j = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; iWidth - 1&lt;br /&gt;            ptrToBytes = ((i) * iWidth) + j&lt;br /&gt;            u = bytes(ptrToBytes + &amp;amp;H10)&lt;br /&gt;            u2 = RGB(u, u, u)&lt;br /&gt;            SetPixelV myPictureBox.hdc, j, i, u2&lt;br /&gt;        &lt;span class="kwrd"&gt;Next&lt;/span&gt; j&lt;br /&gt;    &lt;span class="kwrd"&gt;Next&lt;/span&gt; i&lt;br /&gt;&lt;br /&gt;    myPictureBox.ScaleMode = 3&lt;br /&gt;    myPictureBox.Height = iHeight&lt;br /&gt;    myPictureBox.Width = iWidth&lt;br /&gt;    &lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-7342985393773993698?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/7342985393773993698/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-para-leer-una-imagen-pgm-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/7342985393773993698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/7342985393773993698'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-para-leer-una-imagen-pgm-en.html' title='Ejemplo para leer una imagen PGM en Visual Basic 6.0'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iCpJOoYu6qU/SjaGTA1ySaI/AAAAAAAAAP4/obFkV78FzvY/s72-c/GUI_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3364994236299743996</id><published>2009-08-03T00:55:00.001-06:00</published><updated>2009-08-03T00:55:51.395-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complicaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='uacj'/><title type='text'>Cuando suficiente nunca es suficiente</title><content type='html'>&lt;p&gt;O como los gringos dirían, when enough is not enough, esta ocasión me he puesto a buscarle dos pies al gato sabiendo que solo tiene tres (si, adivinaron: es cojo). &lt;/p&gt;  &lt;p&gt;Estoy a punto de empezar oficialmente a escribir mi tesis de maestría. Digo oficialmente porque el lunes inician clases en la &lt;a target="_blank" href="http://www.uacj.mx"&gt;UACJ&lt;/a&gt;, pero pues ya he iniciado a darle unos entres a esto de la tesis. No he escrito nada todavía en formato oficial, es más ni siquiera en formato no oficial. Pero, ya he leído un par de cosas al respecto, es más, ya hasta he pensado en más de una vez que hasta creo que sé lo que estoy haciendo.&lt;/p&gt;  &lt;p&gt;En este blog he tratado de poner algo de las cosas que he ido aprendiendo en estos semestres que llevo de la escuela, y es reconfortante ver que tiene algo de tráfico el blog, el objetivo de este espacio es que pongo lo que voy viendo y lo que considero que vale la pena subir, y que además no lo enseñan en la escuela, al menos no de manera clara, (jeje) claro, aquí ni yo mismo me entiendo tampoco.&lt;/p&gt;  &lt;p&gt;Eso no es todo, me puse a cambiarle la plantilla al blog y encontré esta que esta bastante bien, solo espero cambiarle el logo. Ya que nada más lo puse a lo loco para que no dijera lo que traía el theme por default. &lt;/p&gt;  &lt;p&gt;¿Y por qué molestarse? Bueno, en realidad no es molestia, más bien es una manera de canalizar lo que esta en la sesera y no dejarlo que se amontone ahí, sin ningún oficio ni beneficio. Sé que la mayoría que visitan este sitio es gente que esta estudiando y busca con relación al procesamiento de imágenes, así que que mejor que poner un par de comentarios para así poder mejorar este sitio y poder agregar contenido (esta bien, también alimentar mi ego :P)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3364994236299743996?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3364994236299743996/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/08/cuando-suficiente-nunca-es-suficiente.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3364994236299743996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3364994236299743996'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/08/cuando-suficiente-nunca-es-suficiente.html' title='Cuando suficiente nunca es suficiente'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1755214948628087781</id><published>2009-07-30T10:33:00.003-06:00</published><updated>2009-08-02T00:36:33.586-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='RLE'/><title type='text'>Codificación RLE para una imagen binaria en MATLAB</title><content type='html'>&lt;p style="text-align: justify"&gt;La codificacion &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Run-length_encoding"&gt;RLE (Run Length Encoding)&lt;/a&gt; se aplica a cadenas de caracteres en las cuales existe una secuencia de datos. En este caso tenemos una imagen binaria, que es resultado de aplicar la &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/06/ejemplo-de-extraccion-de-bits-una.html"&gt;extracción de bits&lt;/a&gt; a una imagen en escala de grises, como se pretende extraer solo un bit en especifico de la imagen, pues el resultado es una imagen binaria, en la cual se tienen valores de 0 o 1 dependiendo del valor del pixel. La imagen será del mismo tamaño de la imagen original puesto que es una operación de pixel por pixel.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Para visualizar de mejor manera lo que se intenta hacer aquí es menester mostrar un ejemplo. La imagen es una matriz de 2D de MxN, y tendremos para una imagen de 8x8 una matriz como la siguiente:&lt;/p&gt;  &lt;div style="text-align: justify" id="lgjn"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="text-align: justify"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SnUz6lwrLzI/AAAAAAAAAPo/QMQE8UzGHjk/s1600-h/Bit%20Extraction%20Example%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Bit Extraction Example" border="0" alt="Bit Extraction Example" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SnUz7TwRSBI/AAAAAAAAAPs/YQP5bdcujrQ/Bit%20Extraction%20Example_thumb%5B2%5D.png?imgmax=800" width="530" height="137" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;De lo anterior se desprende:&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;b&gt;a)&lt;/b&gt; Aquí podemos observar la imagen de 8x8 original, en la cual cada valor de la matriz representa un pixel de 8 bits, o sea valores de 0-255.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;b&gt;b)&lt;/b&gt; En esta imagen se representa cada valor en su equivalente binario, con el propósito de visualizar el valor en bits de cada pixel.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;b&gt;c)&lt;/b&gt; El ultimo ejemplo de estas tres imágenes muestra el valor extraído de cada pixel para el bit mas significativo (MSB), o sea el bit 8.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;La matriz que nos interesa es la matriz contenida en &lt;b&gt;c)&lt;/b&gt;. Para poder codificarla tenemos que tener una cadena de valores en los cuales existan secuencias de valores repetidos. En este caso son solo 0 y 1, y dado a que es una matriz 2D, tenemos que redimensionarla a 1D, y quedaría como se muestra a continuación:&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&amp;#160;&lt;/p&gt;  &lt;div style="text-align: justify" id="qhxe"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Matiz 1D de bits extraídos" border="0" alt="Matiz 1D de bits extraídos" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SnUz7tO5q-I/AAAAAAAAAPw/ku0NvvgvIXU/Matiz%201D%20de%20bits%20extra%C3%ADdos_thumb%5B2%5D.png?imgmax=800" width="530" height="60" /&gt; &lt;/div&gt;  &lt;p style="text-align: justify"&gt;Tenemos una secuencia de valores que se representa en 16 caracteres, y debido a que sabemos que tendremos una secuencia de ceros y unos es importante notar el primer número y después de ahí solo se irán alternando.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Necesitamos establecer una manera de poder decodificar nuestra cadena de caracteres, y reconstruir la imagen original, necesitamos saber un par de datos para regresar a nuestra imagen original. Como se decía en el párrafo anterior es necesario saber con que valor se empieza la secuencia de caracteres, también es necesario saber el tamaño de la imagen original, para que al reconstruir la secuencia unidimensional la podamos regresar a 2D de la misma manera que la original.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Así que el encabezado nos quedará mas o menos de la siguiente manera: &lt;b&gt;Fb M N . . . Secuencia . . .&lt;/b&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;En donde &lt;b&gt;Fb&lt;/b&gt; es el primer caracter, &lt;b&gt;M&lt;/b&gt; y &lt;b&gt;N&lt;/b&gt; es el tamaño de la imagen original y &lt;b&gt;Secuencia&lt;/b&gt;, como su nombre lo indica es la cadena de valores que vamos a almacenar iniciando con Fb y alternando hasta terminar. El ejemplo anterior nos quedaría como a continuación:&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;1 8 8 1 1 1 4 1 3 1 1 1 1 1&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Ahora si, despues de tanto rollo, aqui esta el código en MATLAB para hacer esto.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;a = imread('c:\matlab7\work\lena.pgm');      &lt;br /&gt;[cols rows] = size(a);       &lt;br /&gt;b = BitExtraction(a,8,1,1);       &lt;br /&gt;figure(1); imshow(a);       &lt;br /&gt;figure(2); imshow(uint8(b));       &lt;br /&gt;myEncodedImageB = EncodeRLEimage(b);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="text-align: justify"&gt;Este es el código de la función para extraer bits de la imagen:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="text-align: justify"&gt;function x = BitExtraction(myImagen, B, n ,L)      &lt;br /&gt;      &lt;br /&gt;myImagenNueva = myImagen;       &lt;br /&gt;[rows cols] = size(myImagen);       &lt;br /&gt;      &lt;br /&gt;for i = 1 : rows       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for j = 1 : cols       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;u = double(myImagen(i,j));       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;iEne = floor(u/2^(B-n));       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;iEneMenosUno = floor(u/2^(B-(n-1)));       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;BitExtraido = iEne - (2*iEneMenosUno);       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;if BitExtraido == 1       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;BitExtraido = L;       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;else       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;BitExtraido = 0;       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;end       &lt;br /&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;myImagenNueva(i,j) = BitExtraido;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; end       &lt;br /&gt;end       &lt;br /&gt;x = myImagenNueva;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="text-align: justify"&gt;E&lt;em&gt;&lt;font color="#666666"&gt;ste es la función encargada de codificar la imagen.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function eImg = EncodeRLEimage(myImage)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; encoded = [];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [cols rows] = size(myImage);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; img1D = double(reshape(myImage,1,[]));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SizeOf1D = cols*rows;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; counter = 0;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; encoded = [img1D(1)];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for i =1:SizeOf1D-1       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if img1D(i)==img1D(i+1)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; counter=counter+1;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; encoded = [encoded counter];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; counter = 1;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; end &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if counter ~= 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; encoded = [encoded counter+1];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; end &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; eImg = encoded;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="text-align: center"&gt;&lt;b&gt;&lt;span&gt;&lt;font size="6"&gt;¿Sirve de algo?&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"&gt;&lt;span style="font-size: 32px" class="Apple-style-span"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style="text-align: justify; float: none; margin-left: 0px; margin-right: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:30a3cee6-2964-4d8f-acf3-9778edd495ce" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Procesamiento+Digital+de+Imagenes" rel="tag"&gt;Procesamiento Digital de Imagenes&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Tratamiento+Digital+de+Imagenes" rel="tag"&gt;Tratamiento Digital de Imagenes&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extraccion+de+Bits" rel="tag"&gt;Extraccion de Bits&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Imagen+PGM" rel="tag"&gt;Imagen PGM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Codificacion+RLE" rel="tag"&gt;Codificacion RLE&lt;/a&gt;,&lt;a style="text-decoration: none" href="http://technorati.com/tags/RLE" rel="tag"&gt;RLE&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1755214948628087781?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1755214948628087781/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/07/codificacion-rle-para-una-imagen.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1755214948628087781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1755214948628087781'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/07/codificacion-rle-para-una-imagen.html' title='Codificación RLE para una imagen binaria en MATLAB'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SnUz7TwRSBI/AAAAAAAAAPs/YQP5bdcujrQ/s72-c/Bit%20Extraction%20Example_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-4980398383537600427</id><published>2009-07-28T07:59:00.002-06:00</published><updated>2009-08-02T00:22:00.705-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><title type='text'>¿Qué es compresión de Imágenes?</title><content type='html'>&lt;div style="text-align: justify"&gt;Antes de terminar el compresor (que en estos momentos creo que no va a servir mas que de práctica, je je je, bueno, de todos modos no pensaba desbancar al JPG, todavía), quiero explicar un poco que es la compresión de imágenes. Voy a empezar por poner un par de definiciones:&lt;/div&gt;  &lt;div style="text-align: justify"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: justify"&gt;Según &lt;a id="t2a." title="Gonzalez et al" href="http://www.imageprocessingplace.com/DIP-2E/dip2e_main_page.htm"&gt;Gonzalez et al&lt;/a&gt;:&lt;/div&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;div style="text-align: justify"&gt;&amp;quot;La compresión de imágenes aborda el problema de reducir la cantidad de datos para representar una imagen digital. La compresión se logra removiendo una o más de las tres posibles redundancias básicas. (a)Redundancia de código: cuando se usan códigos de palabra menos óptimos (de menor longitud). (b)Redundancia interpixelaria: Que resulta de la correlación entre pixeles de una imagen. (c)Redundancia psicovisual: La cual se da debido a los datos que el sistema de visión humano ignora&amp;quot;&lt;sup&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=3919270335168988083&amp;amp;postID=4980398383537600427#FOOTNOTE-1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/div&gt;    &lt;div style="text-align: justify"&gt;&lt;sup&gt;&lt;/sup&gt;      &lt;br /&gt;&lt;/div&gt; &lt;/blockquote&gt; Según &lt;a id="e27h" title="Image Compression on Wikipedia" href="http://en.wikipedia.org/wiki/Image_compression"&gt;Wikipedia&lt;/a&gt;:   &lt;blockquote&gt;   &lt;div style="text-align: justify"&gt;&amp;quot;Compresión de imágenes es la aplicación de la compresión de datos en imágenes digitales. En efecto, el objetivo es reducir redundancias en la imagen con el objetivo de transmitirla o almacenarla en una manera eficiente. La compresión puede ser &lt;i&gt;con pérdidas (lossy)&lt;/i&gt;, o &lt;i&gt;sin pérdidas (lossless)&lt;/i&gt;. La compresión con pérdidas que produce diferencias imperceptibles se llama también &lt;i&gt;visualmente sin pérdidas (visual lossless).&amp;quot;&lt;sup&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=3919270335168988083&amp;amp;postID=4980398383537600427#FOOTNOTE-2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/i&gt;&lt;/div&gt;    &lt;div style="text-align: justify"&gt;&lt;sup&gt;&lt;/sup&gt;      &lt;br /&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;div style="text-align: justify"&gt;Entonces podemos decir que se trata de reducir el número de bits con necesarios para representar una imagen. Y hay de dos tipos (que pueden ser tres, y no es el chiste del gato). Con pérdidas, sin pérdidas y visualmente sin pérdidas. En el ejemplo de compresor que estoy tratando de hacer, es un compresor con pérdidas, de una imagen en escala de grises de 8 bits. &lt;/div&gt;  &lt;div style="text-align: justify"&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: justify"&gt;Pero bueno, ¿cómo le hacemos para saber si el compresor que estamos haciendo vale la pena? Pues fácil, hacemos un montón de pruebas, observamos las imágenes resultantes y la que no se vea tan peor pues decimos que es nuestra imagen codificada usando un compresor con pérdidas. También lo podemos hacer de la manera &lt;i&gt;fancy,&lt;/i&gt; usamos &lt;i&gt;PSNR&lt;/i&gt; o &lt;i&gt;MSE &lt;/i&gt;o cualquier otra medida de error matemática para ver que tanto se distorsiona en referencia con la imagen original.&lt;/div&gt;  &lt;br /&gt;  &lt;hr /&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a name="FOOTNOTE-1"&gt;&lt;/a&gt;&lt;span style="font-weight: normal"&gt;&lt;font size="2"&gt;&lt;font face="Arial"&gt;&lt;b&gt;&lt;span style="color: #0000ff" class="Apple-style-span"&gt;Digital Image Processing &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #0000ff" class="Apple-style-span"&gt;2nd Edition (DIP/2e)&lt;/span&gt;&lt;/b&gt;             &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #666666"&gt;by Gonzalez and Woods&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #666666"&gt;© 2002. Prentice Hall&lt;/span&gt;         &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;a name="FOOTNOTE-2"&gt;&lt;/a&gt;&lt;span style="font-weight: normal"&gt;&lt;font size="2"&gt;&lt;font face="Arial"&gt;&lt;b&gt;&lt;span style="color: #0000ff" class="Apple-style-span"&gt;&lt;span style="font-size: 85%"&gt;Image Compression&lt;/span&gt;&lt;/span&gt;               &lt;br /&gt;&lt;/b&gt;&lt;/font&gt;&lt;span style="color: #666666" class="Apple-style-span"&gt;From Wikipedia, the free encyclopedia. Extracted July 28th, 2009&lt;/span&gt;           &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-4980398383537600427?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/4980398383537600427/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/07/que-es-compresion-de-imagenes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4980398383537600427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4980398383537600427'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/07/que-es-compresion-de-imagenes.html' title='¿Qué es compresión de Imágenes?'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-2949856688092040964</id><published>2009-07-27T16:02:00.002-06:00</published><updated>2009-07-28T08:02:40.652-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='PGM'/><title type='text'>Update del Compresor que estoy haciendo</title><content type='html'>&lt;ul&gt;&lt;li&gt;Ya tengo el algoritmo para hacer la extracción de Bits.&lt;/li&gt;&lt;li&gt;Ya tengo el código para codificar la imagen binaria en RLE (gracias JMG, ya lo tenía arrinconado)&lt;/li&gt;&lt;li&gt;Ya tengo el código para decodificar la imagen codificada con lo anterior&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora solo me falta hacer pruebas suficientes para llegar a una conclusión.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo voy a terminar...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;... algún día.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-2949856688092040964?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/2949856688092040964/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/07/update-del-compresor-que-estoy-haciendo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2949856688092040964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2949856688092040964'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/07/update-del-compresor-que-estoy-haciendo.html' title='Update del Compresor que estoy haciendo'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-2683510601438605404</id><published>2009-07-16T14:01:00.002-06:00</published><updated>2009-07-16T14:06:05.330-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Extraccion de Bits'/><category scheme='http://www.blogger.com/atom/ns#' term='PGM'/><title type='text'>Idea para un compresor de imágenes con pérdidas usando extracción de bits y codificación RLE a una imagen PGM</title><content type='html'>&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Tengo una idea para hacer un compresor de imágenes PGM (por si  se preguntan, no, no tengo fijación alguna con este tipo de imágenes solo que es  sencillo, ¡gulp!, trabajar con ellas) con pérdidas usando la extracción de bits  &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/04/ejemplo-de-extraccion-de-bits-de-una.html"&gt;(medio  explicada aquí)&lt;/a&gt; y codificación &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Run-length_encoding"&gt;RLE&lt;/a&gt;. La idea  principal viene de el hecho de que al aplicar un algoritmo extracción de bits a  una imagen tenemos un arreglo binario como resultado, tendremos 1 arreglo 2D de  ceros y unos por cada bit extraído, es decir que para una imagen de 8-bits,  tendremos 8 arreglos de binarios. De esto podemos observar que cada imagen  resultante contiene información de la imagen, y se puede observar una  degradación empezando del bit más significativo hacia abajo. Se pueden emplear  un par de estas imágenes para codificarlas usando un algoritmo de RLE  aprovechando que tendremos secuencias de unos y ceros; luego al recuperarlas y  aplicarles algún tipo de técnica de Diethering, para mejorar la calidad de la  imagen resultante, claro, con pérdida de información con respecto a la  original.&lt;/p&gt; &lt;p align="justify"&gt;A continuación listo los pasos que creo que son necesarios para  este algoritmo:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div align="justify"&gt;Aplicar la extracción de bits a la imagen. Resultado: 8  imágenes (1 por bit en este caso)&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div align="justify"&gt;Seleccionar las imágenes que serán empleadas para la  codificación RLE. Resultado: conjunto de imágenes a comprimir.&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div align="justify"&gt;Aplicar RLE a un cada una de las imágenes seleccionadas en el  paso anterior. Resultado: &lt;em&gt;n &lt;/em&gt;número de conjuntos de datos (1 por  imagen). El total de datos obtenidos aquí nos dará como resultado una  compresión.&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div align="justify"&gt;Para descomprimir la imagen, aplicamos RLE inversa a los  conjuntos de datos. Resultado: n número de imágenes binarias.&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div align="justify"&gt;Se combinan las imágenes obtenidas en el paso anterior (esto  es posible asignando cada bit y reconstruyendo la imagen de 8bits). Resultado:  Imagen de 8bits con pérdida de información.&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div align="justify"&gt;A la imagen resultante le aplicamos algún tipo de Diethering  para mejorar la calidad. Resultado imagen codificada y decodificada con  pérdidas.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt;No se hasta que punto sea posible obtener una buena imagen como  resultado, o que tan buena compresión se pueda lograr para mantener un balance  entre calidad de imagen y compresión.&lt;/p&gt;&lt;p align="justify"&gt;Ya pondré los resultados en un post en cuanto tenga algo que valga la pena. :)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-2683510601438605404?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/2683510601438605404/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/07/idea-para-un-compresor-de-imagenes-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2683510601438605404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2683510601438605404'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/07/idea-para-un-compresor-de-imagenes-con.html' title='Idea para un compresor de imágenes con pérdidas usando extracción de bits y codificación RLE a una imagen PGM'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-2429336293416878022</id><published>2009-06-24T08:13:00.002-06:00</published><updated>2009-06-24T09:04:22.935-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visión computacional'/><category scheme='http://www.blogger.com/atom/ns#' term='visión por computadora'/><title type='text'>Visión por Computadora</title><content type='html'>&lt;p style="TEXT-ALIGN: justify"&gt;¿Qué Visión por Computadora? Emular la visión humana por medio de una computadora. (¿Uhhh?)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;El propósito de la visión por computadora es hacer lo que la visión humana hace, pero, por medios artificiales, para poder entender esto, primero hay que entender un poco como funciona la visión humana ¿no? Pues si, es ahí en donde empiezan los problemas. Nosotros tenemos los sentidos para percibir e interpretar nuestro medio ambiente, las cosas que nos rodean, es ahí donde comienza nuestra realidad. Físicamente, nuestros ojos nos sirven como una especie de sensores que captan las ondas luminosas que se reflejan en los objetos y los captura, los pasa al cerebro como impulsos eléctricos y el cerebro se encarga de hacer todo lo demás. (Que fácil se escucha todo esto, en realidad es mucho más complicado, pero a grandes rasgos así es).&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;El sensor que se encuentra en una cámara fotográfica la podemos comparar (en este caso) con los ojos, es la que nos permite captar las información de las ondas luminosas del ambiente y la convierte a impulsos eléctricos, aquí en este caso, la cámara también funge un poco como cerebro, puesto que procesa las señales eléctricas obtenidas del sensor y las acomoda en una forma que puedan ser transferidas a otro medio. Aquí, no se puede limitar a las cámaras fotográficas como único ejemplo, puesto a que también lo es un aparato de resonancia magnética, o bien, un ultrasonido.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Una parte muy importante en los sistemas de visión por computadora es la iluminación, ya sea la del ambiente o la propia del sistema. ¿Por qué es necesario un sistema de iluminación? Pues porque las condiciones de iluminación del objeto que vamos a capturar pueden afectar el objeto. Nuestro sistema de visión humano no necesita de tan preciso sistema de iluminación ya que puede distinguir los objetos ya que sus algoritmos son demasiado complejos y perfectos que no los podemos comprender. (Si, todavía soy de los que piensan que la computadoras no van a poder igualar el cerebro humano :P) La técnica a utilizar en el sistema va a depender puramente de la aplicación de la misma, esto es, no existe una técnica única para los sistemas de visión, y por lo consiguiente se tiene que analizar cual es la más apropiada para utilizar.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Bueno, si ya tenemos el sensor y la iluminación, ¿qué es lo que nos hace falta? pues la computadora, una vez que el sensor nos capturó la información y la convertimos de una manera que la computadora la pueda leer, pues lo que nos hace falta, son los algoritmos para procesar la imagen. ¡PUM!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Es ahí donde entra el procesamiento digital de imágenes, es emular lo que el cerebro hace, no los ojos, eso ya lo hicieron los sensores, ahora es el turno de emular al cerebro. (good grief!) Existen un gran número de algoritmos y técnicas de procesamiento de imágenes, y al pasar del tiempo se vuelven más complejos y pueden atacar problemas especificos que antes no era posible. Pero hay muchas cosas que el cerebro humano puede hacer y un sistema de visión no (¿por ahorita?)&lt;/p&gt;&lt;br /&gt;&lt;img src="http://img241.imageshack.us/img241/3610/vincentwillemvangogh002.jpg" style="TEXT-ALIGN: center; WIDTH: 234px; DISPLAY: block; HEIGHT: 300px; MARGIN-LEFT: auto; MARGIN-RIGHT: auto" title="On the Threshold of Eternity" height="300" width="234" alt="On the Threshold of Eternity - VWVG"/&gt;&lt;br /&gt;&lt;p style="TEXT-ALIGN: justify"&gt;&lt;br/&gt;&lt;br /&gt;Por ejemplo, si vemos la imágen del gran Vicente, una persona puede decir muchas cosas, desde la combinación de colores, hasta temas filosóficos acerca del porque del sí. Pero, si esta imagen es alimentada a un sistema de visión por computadora, pues no serían más que una fila de ceros y unos, haría falta de aplicar ciertos algoritmos para obtener cierta información, pero solamente será la información para la cual esta diseñado el algoritmo. Una computadora no puede decir nada de la pintura, no puede saber que se quiso transmitir cuando el pintor pintó la obra, ni siquiera se deprime cuando ve la imagen, ni mucho menos se siente identificada con el hastío que le transmite, ni se siente de ese mismo modo.&lt;/p&gt;&lt;br /&gt;&lt;p xmlns="" class="zoundry_raven_tags"&gt;&lt;br /&gt;  &lt;!-- Tag links generated by Zoundry Raven. Do not manually edit. http://www.zoundryraven.com --&gt;&lt;br /&gt;  &lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Technorati&lt;/span&gt; : &lt;a href="http://www.technorati.com/tag/visi%C3%B3n+computacional" class="ztag" rel="tag"&gt;visión computacional&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/visi%C3%B3n+por+computadora" class="ztag" rel="tag"&gt;visión por computadora&lt;/a&gt;&lt;/span&gt;  &lt;br/&gt;&lt;br /&gt; &lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Del.icio.us&lt;/span&gt; : &lt;a href="http://del.icio.us/tag/visi%C3%B3n%20computacional" class="ztag" rel="tag"&gt;visión computacional&lt;/a&gt;, &lt;a href="http://del.icio.us/tag/visi%C3%B3n%20por%20computadora" class="ztag" rel="tag"&gt;visión por computadora&lt;/a&gt;&lt;/span&gt;  &lt;br/&gt;&lt;br /&gt; &lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Zooomr&lt;/span&gt; : &lt;a href="http://www.zooomr.com/search/photos/?q=visi%C3%B3n%20computacional" class="ztag" rel="tag"&gt;visión computacional&lt;/a&gt;, &lt;a href="http://www.zooomr.com/search/photos/?q=visi%C3%B3n%20por%20computadora" class="ztag" rel="tag"&gt;visión por computadora&lt;/a&gt;&lt;/span&gt;  &lt;br/&gt;&lt;br /&gt; &lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Flickr&lt;/span&gt; : &lt;a href="http://www.flickr.com/photos/tags/visi%C3%B3n%20computacional" class="ztag" rel="tag"&gt;visión computacional&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/tags/visi%C3%B3n%20por%20computadora" class="ztag" rel="tag"&gt;visión por computadora&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-2429336293416878022?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/2429336293416878022/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/06/vision-por-computadora.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2429336293416878022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2429336293416878022'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/06/vision-por-computadora.html' title='Visión por Computadora'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-167291470807340675</id><published>2009-06-12T00:15:00.002-06:00</published><updated>2009-08-02T21:14:03.968-06:00</updated><title type='text'>Ejemplo de extracción de Bits a una imagen PGM en LabVIEW 8.6</title><content type='html'>&lt;p align="justify"&gt;El ejemplo a continuación hace exactamente lo mismo que este &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/04/ejemplo-de-extraccion-de-bits-de-una.html"&gt;post pasado&lt;/a&gt;, pero esta ocasión esta implementado en &lt;a target="_blank" href="http://www.ni.com/labview/"&gt;LabVIEW&lt;/a&gt;, utiliza el código mostrado en el &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/06/ejemplo-para-cargar-una-imagen-pgm-en_11.html"&gt;post anterior&lt;/a&gt; donde se carga una imagen PGM y se aplica la extracción de bits a la imagen leída y se muestra en pantalla.&lt;/p&gt;  &lt;p align="justify"&gt;El codigo siguiente muestra como se abre la imagen y se carga en pantalla, luego se obtiene el arreglo 1D de los datos y a ese buffer se le aplica la extracción&amp;#160; de bits y luego se muestra en pantalla.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Extraccion de Bits PGM" border="0" alt="Extraccion de Bits PGM" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHyZgZhtxI/AAAAAAAAALQ/YgRvKlMVIzM/Extraccion%20de%20Bits%20PGM_thumb.png?imgmax=800" width="535"  /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;A continuación se muestra el código para realizar la extracción de bits al arreglo de 1D de bytes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SjHya6CbA4I/AAAAAAAAALU/VpWlzCFboK8/Bit%20Extraction%20to%201D%20U8%20Array%5B2%5D.png?imgmax=800"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Bit Extraction to 1D U8 Array" border="0" alt="Bit Extraction to 1D U8 Array" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHygPOXUCI/AAAAAAAAALY/aCe5yTUk4r4/Bit%20Extraction%20to%201D%20U8%20Array_thumb.png?imgmax=800" width="535" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y así es como queda la imagen&amp;#160; de los chiles al extraer el bit mas significativo de la imagen.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SjH1XDaib2I/AAAAAAAAALc/lhrgMFEPMRs/s1600-h/ResultadoDeExtraccionDeBitsenLabVIEW%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="ResultadoDeExtraccionDeBitsenLabVIEW" border="0" alt="ResultadoDeExtraccionDeBitsenLabVIEW" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SjH1ffI14QI/AAAAAAAAALg/D2ub_45-1qo/ResultadoDeExtraccionDeBitsenLabVIEW_thumb.png?imgmax=800" width="535"  /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Este ejemplo me ha servido para aplicar la teoría en la práctica. Pues estoy haciendo la implementación de&amp;#160; los algoritmos a mano, es divertido. (uy si, definitivamente necesito una vida)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-167291470807340675?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/167291470807340675/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-de-extraccion-de-bits-una.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/167291470807340675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/167291470807340675'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-de-extraccion-de-bits-una.html' title='Ejemplo de extracción de Bits a una imagen PGM en LabVIEW 8.6'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iCpJOoYu6qU/SjHyZgZhtxI/AAAAAAAAALQ/YgRvKlMVIzM/s72-c/Extraccion%20de%20Bits%20PGM_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1850789314698091789</id><published>2009-06-11T21:05:00.002-06:00</published><updated>2009-08-02T21:16:45.602-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento de imágenes con LabVIEW'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='PGM'/><title type='text'>Ejemplo para cargar una imagen PGM en LabVIEW sin IMAQ</title><content type='html'>&lt;div style="text-align: left"&gt;¡También LabVIEW puede Procesar Imágenes!&lt;/div&gt;  &lt;p style="text-align: justify"&gt;Je je, antes de que alguien del cuerpo técnico y ventas de &lt;a target="_blank" href="http://www.ni.com"&gt;National Instruments&lt;/a&gt; lea esto, mejor rectifico.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Dado a la naturaleza de &lt;a target="_blank" href="http://www.ni.com/labview/"&gt;LabVIEW&lt;/a&gt; también se pueden implementar un par de algoritmos (ja ja, de acuerdo, el universo de posibilidades es infinito, “the sky is the limit”) de la manera en que se haría con MATLAB (según un ingeniero de campo de NI me platicó que al principio eran una sola compañía lo que ahora es Mathworks y NI, pero en algún punto en el tiempo se separaron, así que se disputan el origen del engine de matrices ambos, claro que el inge de NI juraba que era de ellos, jeje, me imagino que dirían los de Mathworks) , ya saben el paradigma orientado a datos que manejan estos de &lt;a target="_blank" href="http://www.ni.com"&gt;National Instruments&lt;/a&gt;, claro ellos tienen un Toolkit dedicado al procesamiento de imágenes, pero este post se enfocará en implementarlo sin el uso del tan famoso &lt;a target="_blank" href="http://www.ni.com/vision/vdm.htm"&gt;Vision Development Module&lt;/a&gt;.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Como ya he puesto en otros posts vamos a leer imágenes &lt;a target="_blank" href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;PGM&lt;/a&gt; ya que LabVIEW no cuenta con una librería para leer este tipo de imágenes. Las imágenes PGM son ampliamente usadas para probar algoritmos de procesamiento digital de imágenes,&amp;#160; son fotos en escala de grises cada byte representa un pixel, es decir 8 bits, 256 posibles escalas de grises.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;El ejemplo que propongo consta de un VI (instrumento virtual) principal y 3 subVIs. (Los VIs se pueden ver como la contraparte de las funciones en los programas por texto). La primera parte consta de leer un archivo del disco duro, se lee como archivo binario, como resultado de este se obtiene un arreglo de bytes que contiene los valores leídos en el archivo. En seguida pasa por un &lt;em&gt;parser&lt;/em&gt; para el encabezado del archivo PGM, que básicamente comienza con dos bytes en ascii representando “P5”, en seguida viene el ancho, seguido del alto de la imagen, y para finalizar el nivel de grises en que está codificada la imagen. En medio de estos debe de estar como separador un espacio, ya sea un espacio en blanco (0x20), un carrier return (0x0D), un line feed (0x0A) o un tab (0x09). También hay que notar que después del “P5” se pueden tener comentarios y se identifican con el símbolo (#) al principio de la línea. Para más información del formato PGM, favor de ir a la &lt;a target="_blank" href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;página de la especificación.&lt;/a&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;A continuación se muestra el VI principal que realiza el leer el archivo, procesar la información y mostrarla en pantalla.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHF9egq1JI/AAAAAAAAAKo/m-0Uv6R4ZMY/s1600-h/ReadPGM_CaseTrue6.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ReadPGM_CaseTrue" border="0" alt="ReadPGM_CaseTrue" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SjHF-MDmL9I/AAAAAAAAAKs/MNT1CbjoY7E/ReadPGM_CaseTrue_thumb4.png?imgmax=800" width="535"  /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHF-wC4e4I/AAAAAAAAAKw/O0yPAGn4Rik/s1600-h/ReadPGM_CaseFalse6.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ReadPGM_CaseFalse" border="0" alt="ReadPGM_CaseFalse" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHF_aruRnI/AAAAAAAAAK0/ywE2tNdtQzE/ReadPGM_CaseFalse_thumb4.png?imgmax=800" width="535" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p style="text-align: justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Una de las funciones del VI “ParsePGMHeader.vi” es determinar si es un archivo válido, es por eso que la salida del VI se alambra a un &lt;em&gt;case&lt;/em&gt; para determinar si es válido y continuar o de lo contrario terminar el programa, como se observa en las figuras anteriores. Tengo que agradecer a un miembro del foro de NI &lt;strong&gt;(JB)&lt;/strong&gt; de donde tome el VI para mostrar un msgbox en LabVIEW si lo necesitan pueden checar el &lt;a target="_blank" href="http://forums.ni.com/ni/board/message?board.id=170&amp;amp;message.id=56916&amp;amp;query.id=205602"&gt;foro&lt;/a&gt;. (n.d.r: el post es algo viejo y es para una versión de LabVIEW algo vieja por ende, y no se si la versión 8.6 ya tenga algo embebido). A continuación se muestra el diagrama a bloques de “ParsePGMHeader.vi”&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SjHGAT5iiEI/AAAAAAAAAK4/qHavl9Z9BvY/s1600-h/ParsePGMHeader5.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ParsePGMHeader" border="0" alt="ParsePGMHeader" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SjHGBBmBuGI/AAAAAAAAAK8/wssEa6Xr6dc/ParsePGMHeader_thumb3.png?imgmax=800" width="535" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p style="text-align: justify"&gt;Este parser lo que hace es que lee el bufer de bytes que se leen de el archivo y busca el encabezado, de ahí saca el ancho y el alto de la imagen, (tengo que confesar que este algoritmo no cumple completamente con la especificación, ya que asume que la imagen es de 256 niveles de grises, pero eso no es necesariamente cierto según la especificación; y entonces los pixeles ya no serían necesariamente de un byte, sino de dos. :S) Así como también, determina si es un archivo válido. En seguida lee el valor &lt;strong&gt;&lt;em&gt;isPGM?&lt;/em&gt;&lt;/strong&gt; y se mete a un &lt;em&gt;case, &lt;/em&gt;para determinar si se continúa con la ejecución o se detiene le programa. &lt;/p&gt;  &lt;p style="text-align: justify"&gt;En caso de ser verdadero, se agarra el buffer de datos y se obtiene el buffer de la imagen, como datos de entrada se tiene la salida del VI anterior, el cual le pasa el buffer, en donde empieza la imagen y el ancho y alto de la misma. La salida de este VI nos da un arreglo en 2D conteniendo la imagen. A continuacion se muestra el diagrama del VI &lt;strong&gt;“GetPGMImageData.vi”.&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SjHGBp43XXI/AAAAAAAAALA/O-O2npTrlGk/s1600-h/GetPGMImageData2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="GetPGMImageData" border="0" alt="GetPGMImageData" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SjHGCUezlgI/AAAAAAAAALE/6Z1K-WxHCwc/GetPGMImageData_thumb.png?imgmax=800" width="535" /&gt;&lt;/a&gt; La salida de este VI se usa para dibujar la imagen PGM en un objeto &lt;em&gt;picture&lt;/em&gt;. También da como salida el ancho y alto de la imagen. En seguida se muestra el &lt;strong&gt;“DrawPGMImage.vi”&lt;/strong&gt;. A la cual se le pasa como entrada el arreglo en 2D conteniendo la imagen y a la salida se le conecta&amp;#160; un objeto &lt;em&gt;picture&lt;/em&gt;. El diagrama se muestra a continuación.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="text-align: justify"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SjHGCwr60FI/AAAAAAAAALI/RRrJMW6b0bM/s1600-h/DrawPGMImage2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DrawPGMImage" border="0" alt="DrawPGMImage" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SjHGDZCx7WI/AAAAAAAAALM/_bJWcZMzxHQ/DrawPGMImage_thumb.png?imgmax=800" width="535" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p style="text-align: justify"&gt;Al final en el VI se agrega un nodo de propiedades para poder modificar el ancho y alto de la imagen a mostrar, dependiendo del tamaño de la imagen original.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Como decía al principio, es que se trata de cargar la imagen sin necesidad de tener el Toolkit de procesamiento de imágenes, ya que trae integradas funciones para leer archivos png, jpg y bmp, pero no los pgm. Igual, si quieren los archivos para hacer pruebas solo mándenme un &lt;a target="_blank" href="mailto:gustavo.ramirez.v@gmail.com"&gt;email&lt;/a&gt; y se los envío con gusto. Todavía ando viendo como hacerle para poder subir archivos y linkearlos al blog, creo que no me va a quedar de otra que usar un disco virtual.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Simple, ¿no?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1850789314698091789?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1850789314698091789/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-para-cargar-una-imagen-pgm-en_11.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1850789314698091789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1850789314698091789'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/06/ejemplo-para-cargar-una-imagen-pgm-en_11.html' title='Ejemplo para cargar una imagen PGM en LabVIEW sin IMAQ'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SjHF-MDmL9I/AAAAAAAAAKs/MNT1CbjoY7E/s72-c/ReadPGM_CaseTrue_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-8716201454153063050</id><published>2009-06-10T10:14:00.001-06:00</published><updated>2009-06-10T10:18:12.904-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='FFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='GUIDE'/><title type='text'>Cómo mostrar una imagen transformada con fft2 en GUIDE usando MATLAB7</title><content type='html'>&lt;p align="justify"&gt;Este ejemplo es para complementar el ejemplo anterior de &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/05/ejemplo-simple-de-una-interfaz-grafica.html"&gt;“Un ejemplo simple de una interfaz gráfica usando GUIDE en MATLAB para Procesamiento Digital de Imágenes”.&lt;/a&gt; En esa ocasión el énfasis que puse fue en mostrar como se crea la interfaz gráfica y como se muestra una imagen en pantalla. Ahora se muestra como agregar el código  para mostrar la transformada de Fourier usando la función &lt;strong&gt;&lt;em&gt;fft2 &lt;/em&gt;&lt;/strong&gt;que viene incluida en MATLAB.&lt;/p&gt;&lt;p align="justify"&gt;Si se sigue el ejemplo anterior solamente tendremos que agregar el siguiente código al &lt;em&gt;&lt;strong&gt;callback&lt;/strong&gt;&lt;/em&gt; del botón relacionado al procesamiento de la imagen.&lt;/p&gt;&lt;blockquote&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;% --- Executes on button press in ProcesarImagen.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;function&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt; &lt;/span&gt;ProcesarImagen_Callback(hObject, eventdata, handles)&lt;br /&gt;&lt;span class="rem"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;% hObject    handle to ProcesarImagen (see GCBO)&lt;br /&gt;% eventdata  reserved - to be defined in a future version of MATLAB&lt;br /&gt;% handles    structure with handles and user data (see GUIDATA)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; guidata(hObject, handles);&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;% Carga la imagen de la variable global a una local.&lt;/span&gt;&lt;br /&gt; mImage = handles.myImage; &lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;% Calcula la transformada de fourier&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;  &lt;/span&gt;&lt;br /&gt; mImage2 = fft2(double(mImage));&lt;br /&gt;&lt;span class="rem"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;% Acondiciona la imagen para mostrar las magnitudes centradas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; s = fftshift(log(abs(mImage2)));&lt;br /&gt; limites = [(min(s(:))) (max(s(:)))];&lt;br /&gt; set(handles.axes2, &lt;span class="str"&gt;&lt;span class="Apple-style-span"  style="color:#6666CC;"&gt;'CLim'&lt;/span&gt;&lt;/span&gt;, limites);&lt;br /&gt; image( s, &lt;span class="str"&gt;&lt;span class="Apple-style-span"  style="color:#6666CC;"&gt;'Parent'&lt;/span&gt;&lt;/span&gt;, handles.axes2, &lt;span class="str"&gt;&lt;span class="Apple-style-span"  style="color:#6633FF;"&gt;'CDataMapping'&lt;/span&gt;&lt;/span&gt;, &lt;span class="str"&gt;&lt;span class="Apple-style-span"  style="color:#6633FF;"&gt;'scaled'&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt; axis(handles.axes2, &lt;span class="str"&gt;&lt;span class="Apple-style-span"  style="color:#6633FF;"&gt;'off'&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt; guidata(hObject, handles);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p align="justify"&gt;No tengo manera de subir los archivos todavia, y no quiero ponerlos en un servidor externo así que si alguien le interesa alguno de los ejemplos que aqui se ponen, simplemente manden un &lt;a target="_blank" href="mailto:gustavo.ramirez.v@gmail.com"&gt;email&lt;/a&gt; y se los mando&lt;/p&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-8716201454153063050?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/8716201454153063050/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/06/como-mostrar-una-imagen-transformada.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8716201454153063050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8716201454153063050'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/06/como-mostrar-una-imagen-transformada.html' title='Cómo mostrar una imagen transformada con fft2 en GUIDE usando MATLAB7'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-4082630900157153790</id><published>2009-05-30T00:18:00.001-06:00</published><updated>2009-05-30T00:25:22.175-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uacj'/><title type='text'>Un post en silencio</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SiDPp3EKThI/AAAAAAAAAJI/9kC5Fa5iZgM/s1600-h/Black_ribbon%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Black_ribbon" border="0" alt="Black_ribbon" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SiDPq1se0TI/AAAAAAAAAJM/3Kmrm0nBN8Y/Black_ribbon_thumb%5B7%5D.png?imgmax=800" width="128" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-4082630900157153790?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/4082630900157153790/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/05/un-post-de-silencio.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4082630900157153790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/4082630900157153790'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/05/un-post-de-silencio.html' title='Un post en silencio'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iCpJOoYu6qU/SiDPq1se0TI/AAAAAAAAAJM/3Kmrm0nBN8Y/s72-c/Black_ribbon_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3967574580126226387</id><published>2009-05-29T17:52:00.002-06:00</published><updated>2009-05-29T22:01:10.673-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zoundry Raven'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog  publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='Software para publicar en blogs'/><title type='text'>Otro Software para editar posts Offline "El cuervo" Zoundry Raven</title><content type='html'>&lt;p style="text-align: justify"&gt;Dado a que no se por que motivo no he podido publicar desde Windows Live Writer, tuve que darme a la tarea de buscar un editor de reemplazo para WLW, ya estaba empezando a agarrarle la movida cuando de repente, ya no pude poner ni un post más y solo me daba un error como de &amp;quot;object not found&amp;quot; o algo por el estilo. La verdad no quise buscar más y no perder tiempo en arreglar algo que de la nada salió.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Bueno haciendo uso de San Google, me encontré con un par de aplicaciones que me parecieron interesantes. La primera, &lt;a title="BlogDesk" target="_blank" href="http://www.blogdesk.org/"&gt;BlogDesk&lt;/a&gt;. Leí un par de criticas favorables acerca de BlogDesk, pero el único pero que le encontré es que no funciona para el vulgo, o sea, &lt;a title="Blogger" target="_blank" href="http://www.blogger.com/"&gt;Blogger&lt;/a&gt;. Y como es por ahorita mi sistema predilecto de blogeo, pues a pesar de instalarlo, tuve que descartarlo de la lista. Después me encontré con este &lt;a title="Zoundry Raven" target="_blank" href="http://www.zoundryraven.com/"&gt;Zoundry Raven&lt;/a&gt;, el cual hasta ahorita, me parece bueno. Al menos mejor que el editor on-line de blogger, que tenía un post listo para publicar en WLW y después tuve que volver a poner en blogger y pues fue un desastre el volver a formatear el texto y subir las imágenes, pero bueno, al final quedó publicado, no como yo quisiera y sin antes aventarme un clavado dentro del HTML.&lt;/p&gt;  &lt;p style="text-align: justify"&gt;Por ahorita tiene todo lo que podría ocupar para publicar posts en mi blog, no se si se le pueden agregar &amp;quot;plug-ins&amp;quot; como al WLW, pero haber que sale.&lt;/p&gt;  &lt;br /&gt;  &lt;p style="text-align: center"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://img12.imageshack.us/img12/706/zrclip001p63b38efc.png" width="458" height="272" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3967574580126226387?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3967574580126226387/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/05/otro-software-para-editar-posts-offline.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3967574580126226387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3967574580126226387'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/05/otro-software-para-editar-posts-offline.html' title='Otro Software para editar posts Offline &amp;quot;El cuervo&amp;quot; Zoundry Raven'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-5649740682350957440</id><published>2009-05-28T17:59:00.030-06:00</published><updated>2009-08-02T21:10:24.014-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial basico de GUIDE en MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='GUIDE'/><title type='text'>Ejemplo simple de una interfaz gráfica usando GUIDE en MATLAB para procesamiento digital de imágenes</title><content type='html'>&lt;p align="justify"&gt;Hace poco que aprendí lo básico de crear interfaces gráficas en Matlab. En realidad es hasta cierto punto simple, pero también creo que no es del todo amigable para crear GUIs. Si, estoy de acuerdo que tiene un estilo de editor para hacernos más fácil la existencia. Pero no es del todo intuitivo, o al menos es lo que pienso en el par de programitas que he tenido oportunidad de hacer. Bueno dejando las quejas a un lado, voy a empezar con el ejemplo. Voy a crear una ventana en la que se cargue una imagen por medio de un botón y desplegarla en la ventana, y hacer un procesamiento sencillo y también mostrarlo en pantalla, se que es un ejemplo muy básico, pero creo que es perfecto para empezar. (o al menos es lo que andaba buscando yo cuando quise hacer esto)&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;Lo primero que tenemos que hacer es iniciar el editor GUIDE que se puede hacer de dos maneras, la primera es desde el menú de inicio: &lt;strong&gt;File –&amp;gt; New –&amp;gt; GUI&lt;/strong&gt; como se muestra en la siguiente imagen.&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/guide1.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Guide1" border="0" alt="Guide1" src="http://dipuacj.files.wordpress.com/2009/05/guide1_thumb.png" width="383" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;También se puede iniciar desde la línea de comandos o “command window” de Matlab poniendo “guide”.&amp;#160; Aparece una ventana de inicio del GUIDE.&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/guidestart.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="guidestart" border="0" alt="guidestart" src="http://dipuacj.files.wordpress.com/2009/05/guidestart_thumb.png" width="454" height="316" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;La ventana anterior es (como su nombre lo indica) el lanzador rápido para el GUIDE con varias opciones, la que vamos a seleccionar es la que viene por default y presionamos “OK” y nos aparece el editor de interfaces gráficas en blanco, como se muestra a continuación:&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/untitled.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Untitled" border="0" alt="Untitled" src="http://dipuacj.files.wordpress.com/2009/05/untitled_thumb.png" width="535"  /&gt;&lt;/a&gt; Como primer paso vamos a insertar el objeto que nos va a servir para desplegar la imagen en la ventana. En este caso Matlab lo maneja con “axes”, así que presionamos el botón que esta en la barra de herramientas de la izquierda y ponemos dos “axes” que es donde vamos a cargar la imagen original y la procesada, como se muestra en la siguiente imagen.&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/conaxes.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ConAxes" border="0" alt="ConAxes" src="http://dipuacj.files.wordpress.com/2009/05/conaxes_thumb.png" width="535"  /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;Luego presionando el botón “Push Button” &lt;strong&gt;(1)&lt;/strong&gt; ponemos dos botones &lt;strong&gt;(2)&lt;/strong&gt; que el primero nos va a servir para seleccionar el archivo de la imagen y el segundo para procesarla, también vamos a mostrar donde se seleccionan y se cambian las propiedades del objeto &lt;strong&gt;(3)&lt;/strong&gt;.&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/ponerbotones.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="PonerBotones" border="0" alt="PonerBotones" src="http://dipuacj.files.wordpress.com/2009/05/ponerbotones_thumb.png" width="535"  /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;En la figura siguiente se muestra el inspector de propiedades “property inspector” en donde podemos modificar las propiedades del botón. En el &lt;strong&gt;(1)&lt;/strong&gt;&amp;#160; se modifica el texto del botón, y en &lt;strong&gt;(2)&lt;/strong&gt;,&lt;strong&gt; &lt;/strong&gt;se modifica el nombre del botón.&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/propertyinspector.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="PropertyInspector" border="0" alt="PropertyInspector" src="http://dipuacj.files.wordpress.com/2009/05/propertyinspector_thumb.png" width="370" height="772" /&gt;&lt;/a&gt;Modificamos (1) y (2) para cada botón de manera que nos quede como en la imagen siguiente.&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/cambios.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Cambios" border="0" alt="Cambios" src="http://dipuacj.files.wordpress.com/2009/05/cambios_thumb.png" width="349" height="294" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;En donde dice &lt;strong&gt;&lt;em&gt;String&lt;/em&gt;&lt;/strong&gt; simple y sencillamente cambiamos el texto que tiene el botón y en donde dice &lt;strong&gt;&lt;em&gt;tag&lt;/em&gt;&lt;/strong&gt; se define el nombre del botón, esto es importante, porque aquí es donde definimos el nombre que va a tener la función &lt;strong&gt;“&lt;em&gt;Callback”&lt;/em&gt;&lt;/strong&gt; que es la que se manda llamar cuando se presiona el botón. En la imagen siguiente se muestra como queda la GUI con los cambios hechos. Tambien se muestra como tener acceso a la función donde vamos a poner el código que nos cargue la imagen en pantalla. &lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/guimodificada.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Guimodificada" border="0" alt="Guimodificada" src="http://dipuacj.files.wordpress.com/2009/05/guimodificada_thumb.png" width="530" /&gt;&lt;/a&gt;A continuación se abre la ventana del editor de códigos de MATLAB y nos selecciona el inicio de la función en la que debemos agregarle nuestro código que en este ejemplo nos va a seleccionar un archivo para ponerlo en &lt;strong&gt;&lt;em&gt;axes1.&lt;/em&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/callaback.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Callback" border="0" alt="Callback" src="http://dipuacj.files.wordpress.com/2009/05/callaback_thumb.png" width="535"  /&gt;&lt;/a&gt;Una vez que tenemos el editor de MATLAB abierto, buscamos el siguiente código y le agregamos la línea de código que se muestra a continuación, lo que se esta haciendo es agregar una variable para almacenar en memoria la imagen que vamos a cargar .&lt;/p&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#008000"&gt;% --- Executes just before GuiBasica is made visible.        &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;function &lt;/font&gt;&lt;font color="#000000"&gt;GuiBasica_OpeningFcn(hObject, eventdata, handles, varargin)        &lt;br /&gt;&lt;/font&gt;&lt;font color="#008000"&gt;% This function has no output args, see OutputFcn.        &lt;br /&gt;% hObject&amp;#160;&amp;#160;&amp;#160; handle to figure         &lt;br /&gt;% eventdata&amp;#160; reserved - to be defined in a future version of MATLAB         &lt;br /&gt;% handles&amp;#160;&amp;#160;&amp;#160; structure with handles and user data (see GUIDATA)         &lt;br /&gt;% varargin&amp;#160;&amp;#160; command line arguments to GuiBasica (see VARARGIN) &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#008000"&gt;% Choose default command line output for GuiBasica        &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;handles.output = hObject; &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#008000"&gt;%Add variable to hold images (Agregar variable para almacenar imágenes)&lt;/font&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;handles.myImage = []; &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#008000"&gt;% Update handles structure        &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;guidata(hObject, handles);&lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;&lt;/blockquote&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;La línea que agregué en el código anterior es donde dice &lt;strong&gt;&lt;em&gt;handles.myImage = [];&lt;/em&gt;&lt;/strong&gt; que nos va a servir para almacenar la imagen temporalmente para procesarla cuando tengamos que hacerlo en el botón que definimos para procesar la imagen.&lt;/p&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;El código siguiente se agrega en el &lt;strong&gt;&lt;em&gt;callback&lt;/em&gt;&lt;/strong&gt; del botón &lt;strong&gt;&lt;em&gt;CargarImagen.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#000000"&gt;&lt;font color="#008000"&gt;% --- Executes on button press in CargarImagen.          &lt;br /&gt;&lt;/font&gt;function CargarImagen_Callback(hObject, eventdata, handles)         &lt;br /&gt;&lt;font color="#008000"&gt;% hObject&amp;#160;&amp;#160;&amp;#160; handle to CargarImagen (see GCBO)          &lt;br /&gt;% eventdata&amp;#160; reserved - to be defined in a future version of MATLAB           &lt;br /&gt;% handles&amp;#160;&amp;#160;&amp;#160; structure with handles and user data (see GUIDATA)           &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;try          &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; [filename,pathname] = uigetfile('&lt;font color="#8000ff"&gt;*.pgm'&lt;/font&gt;,&lt;font color="#8000ff"&gt;'Selecciona imagen para abrir'&lt;/font&gt;); &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;if &lt;/font&gt;isequal(filename,0)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;%Do nothing yet          &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;else          &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; handles.myImage = imread(fullfile(pathname, filename)); &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [X, myMap] = gray2ind(handles.myImage);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mImagen2 = ind2rgb(X,myMap); &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; image(mImagen2, &lt;font color="#8000ff"&gt;'Parent'&lt;/font&gt;, handles.axes1);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; colormap(gray);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;end          &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; guidata(hObject, handles);         &lt;br /&gt;&lt;font color="#0000ff"&gt;catch          &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; msgbox(&lt;font color="#8000ff"&gt;'Error'&lt;/font&gt;)         &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;end&lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;&lt;/blockquote&gt;  &lt;br /&gt;  &lt;p align="justify"&gt;&lt;font color="#000000"&gt;Y agregando el código siguiente al &lt;strong&gt;&lt;em&gt;callback&lt;/em&gt;&lt;/strong&gt; del botón &lt;strong&gt;&lt;em&gt;ProcesarImagen&lt;/em&gt;&lt;/strong&gt; como se muestra a continuación hacemos nuestro ejemplo de procesamiento, aquí solamente voy a hacer el negativo de la imagen para ilustrar el ejemplo con algo simple, en este caso se pretende mostrar como hacer un GUI en MATLAB, no dar una clase de procesamiento de imágenes.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#000000"&gt;&lt;font color="#008000"&gt;% --- Executes on button press in ProcesarImagen.          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt; ProcesarImagen_Callback(hObject, eventdata, handles)         &lt;br /&gt;&lt;font color="#008000"&gt;% hObject&amp;#160;&amp;#160;&amp;#160; handle to ProcesarImagen (see GCBO)          &lt;br /&gt;% eventdata&amp;#160; reserved - to be defined in a future version of MATLAB           &lt;br /&gt;% handles&amp;#160;&amp;#160;&amp;#160; structure with handles and user data (see GUIDATA)           &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; guidata(hObject, handles);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; mImage = handles.myImage;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; mImage2 = 255-mImage;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [X, myMap] = gray2ind(mImage2);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; mImagen2 = ind2rgb(X,myMap); &lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; image(mImagen2, &lt;font color="#8000ff"&gt;'Parent'&lt;/font&gt;, handles.axes2);&lt;/font&gt;&lt;/p&gt;    &lt;br /&gt;&lt;/blockquote&gt;  &lt;br /&gt;  &lt;p&gt;Y a continuación se muestra como queda el resultado final de nuestra GUI.&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;a href="http://dipuacj.files.wordpress.com/2009/05/resultado.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Resultado" border="0" alt="Resultado" src="http://dipuacj.files.wordpress.com/2009/05/resultado_thumb.png" width="536" height="407" /&gt;&lt;/a&gt; Si todo se ha hecho como se indica, debería de funcionar. jeje. En caso de que me falte un paso o que algo no se entienda solo manden un correo y trataré de corregirlo. &lt;a href="mailto:gustavo.ramirez.v@gmail.com"&gt;gustavo.ramirez.v@gmail.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-5649740682350957440?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/5649740682350957440/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/05/ejemplo-simple-de-una-interfaz-grafica.html#comment-form' title='15 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/5649740682350957440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/5649740682350957440'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/05/ejemplo-simple-de-una-interfaz-grafica.html' title='Ejemplo simple de una interfaz gráfica usando GUIDE en MATLAB para procesamiento digital de imágenes'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-2874688766673998370</id><published>2009-04-23T03:00:00.002-06:00</published><updated>2009-08-02T21:19:16.086-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imagenes'/><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='uacj'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Procesamiento digital de imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Extraccion de Bits'/><category scheme='http://www.blogger.com/atom/ns#' term='Extracción de bits'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><category scheme='http://www.blogger.com/atom/ns#' term='PGM'/><title type='text'>Ejemplo de extracción de bits de una imagen en escala de grises de 8 bits en MATLAB</title><content type='html'>&lt;p align="justify"&gt;&lt;font size="3"&gt;En este caso supongamos que tenemos una imagen en formato &lt;/font&gt;&lt;a target="_blank" href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;&lt;font size="3"&gt;PGM&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt;, (escala de grises de 256 niveles, o sea 8 bits). Si queremos extraer la información de cada bit entonces tenemos lo siguiente: &lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;em&gt;u&lt;/em&gt;&lt;/strong&gt;, es el valor del pixel al que le vamos a extraer el bit&lt;/font&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;em&gt;B,&lt;/em&gt;&lt;/strong&gt; es el número de bits usado para representar un pixel&lt;/font&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt;, es el bit que queremos extraer de cada pixel, &lt;u&gt;&lt;strong&gt;&lt;em&gt;B&lt;/em&gt;&lt;/strong&gt; es el menos significativo y &lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt; es el más significativo&lt;/u&gt;&lt;/font&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;em&gt;L&lt;/em&gt;&lt;/strong&gt;, es en nivel máximo que puede tener nuestra imagen&lt;/font&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;Según &lt;/font&gt;&lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?%5Fencoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Anil%20K.%20Jain"&gt;&lt;font size="3"&gt;Anil K. Jain&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt; en su libro &lt;/font&gt;&lt;a target="_blank" href="http://www.amazon.com/Fundamentals-Processing-Prentice-Information-Sciences/dp/0133361659"&gt;&lt;font size="3"&gt;Fundamentals of Digital Image Processing&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt;, en el capítulo dedicado al mejoramiento de imágenes (o &lt;em&gt;image enhancement&lt;/em&gt;), explica la extracción de bits en una imagen y define al pixel &lt;strong&gt;&lt;em&gt;u&lt;/em&gt;&lt;/strong&gt; de la siguiente manera:&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SfAt53_StBI/AAAAAAAAAEc/UKDvG05JgO4/s1600-h/u%5B4%5D.png"&gt;&lt;font size="3"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="u, nuestro pixel original" border="0" alt="u, nuestro pixel original" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SfAt6sISOAI/AAAAAAAAAEg/8J7dJXbotU4/u_thumb%5B2%5D.png?imgmax=800" width="602" height="51" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;y queremos que nuestro pixel resultado &lt;strong&gt;&lt;em&gt;v &lt;/em&gt;&lt;/strong&gt;de la extracción de bit sea:&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SfAt78JjpGI/AAAAAAAAAEk/Vt9XHcRNkZI/s1600-h/v%5B13%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="v" border="0" alt="v" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SfAt-4sdE6I/AAAAAAAAAEo/3ZQm0BxMD40/v_thumb%5B7%5D.png?imgmax=800" width="304" height="101" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;El autor define &lt;strong&gt;&lt;em&gt;k&lt;/em&gt;&lt;/strong&gt;&lt;font size="1"&gt;&lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;como se muestra a continuación: &lt;/font&gt;&lt;font color="#222222" size="3"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SfAt_4Nxn0I/AAAAAAAAAEs/-Y2T3wfhEDA/s1600-h/kn%5B28%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="kn" border="0" alt="kn" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SfAuBjWSFSI/AAAAAAAAAEw/lR4cwOKeCO0/kn_thumb%5B22%5D.png?imgmax=800" width="244" height="64" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;En donde:&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SfAuDhsDLmI/AAAAAAAAAE0/aUpEVRC3W-g/s1600-h/in%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="in" border="0" alt="in" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SfAuFcxbFWI/AAAAAAAAAE4/zXomA0rS62I/in_thumb%5B1%5D.png?imgmax=800" width="204" height="95" /&gt;&lt;/a&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;En&amp;#160; este caso &lt;strong&gt;&lt;em&gt;u&lt;/em&gt;&lt;/strong&gt; puede tomar valores entre 0 y 255 (ya que es una imagen PGM de 8 bits). Por ejemplo si decimos que &lt;strong&gt;&lt;em&gt;u = 237&lt;/em&gt;&lt;/strong&gt; y queremos extraer el bit más significativo entonces tenemos que &lt;strong&gt;&lt;em&gt;n = 8&lt;/em&gt;&lt;/strong&gt;&amp;#160; y &lt;strong&gt;&lt;em&gt;B = 8. &lt;/em&gt;&lt;/strong&gt;Representando u en su equivalente binario tendriamos que &lt;strong&gt;&lt;em&gt;u = 11101101.&lt;/em&gt;&lt;/strong&gt; Nos quedaría de la siguiente manera:&lt;/font&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;       &lt;div align="justify"&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;em&gt;i&lt;font size="1"&gt;n&lt;/font&gt; = i&lt;font size="1"&gt;8&lt;/font&gt; = int[237/(2^8-8)] = 237&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="justify"&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;i&lt;font size="1"&gt;n-1&lt;/font&gt; = i&lt;font size="1"&gt;7&lt;/font&gt; = int[237/(2^8-7)] = int[237/2^1] = int[237/2] = int[118.5] = 118&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;div align="justify"&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;k&lt;font size="1"&gt;n&lt;/font&gt; = &lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;k&lt;font size="1"&gt;8&lt;/font&gt; = 237 – 2*118 = 237 – 236 = 1&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;&lt;font size="3"&gt;Enseguida se muestra el codigo en MATLAB para llevar a cabo la extracción de bits de la imagen del bote:&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="2"&gt;clc;clear;        &lt;br /&gt;myImagen = imread('boat.pgm');         &lt;br /&gt;myImagenNueva = myImagen;         &lt;br /&gt;[rows cols] = size(myImagen); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="2"&gt;B = 8;        &lt;br /&gt;L = 255; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="2"&gt;for n = 1:B        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for i = 1 : rows         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for j = 1 : cols&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; u = double(myImagen(i,j));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iEne = floor(u/2^(B-n));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iEneMenosUno = floor(u/2^(B-(n-1)));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BitExtraido = iEne - (2*iEneMenosUno);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if BitExtraido == 1         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BitExtraido = L;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BitExtraido = 0;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; myImagenNueva(i,j) = BitExtraido;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; end         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; subplot(2,4,n);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; imshow(myImagenNueva);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; title(['Bit', num2str(n)]);         &lt;br /&gt;end&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;    &lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SfAxE_IPUxI/AAAAAAAAAFE/szHX-tG4j88/s1600-h/EjemploExtracionDeBitsMATLAB%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="EjemploExtracionDeBitsMATLAB" border="0" alt="EjemploExtracionDeBitsMATLAB" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SfAxKnWAj4I/AAAAAAAAAFI/O-ozyQuvi00/EjemploExtracionDeBitsMATLAB_thumb%5B5%5D.png?imgmax=800" width="535" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-2874688766673998370?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/2874688766673998370/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/04/ejemplo-de-extraccion-de-bits-de-una.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2874688766673998370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/2874688766673998370'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/04/ejemplo-de-extraccion-de-bits-de-una.html' title='Ejemplo de extracción de bits de una imagen en escala de grises de 8 bits en MATLAB'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iCpJOoYu6qU/SfAt6sISOAI/AAAAAAAAAEg/8J7dJXbotU4/s72-c/u_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-6203990271305943943</id><published>2009-03-08T03:23:00.003-07:00</published><updated>2009-08-02T22:00:50.697-06:00</updated><title type='text'>Mucho ruido y pocas nueces. Cuantización escalar con Dithering aplicando ruido pseudo-aleatorio en MATLAB</title><content type='html'>&lt;p align="justify"&gt;En este ejemplo voy a tomar una imagen PGM de 8 bits en escala de grises (256 tonos de grises o 2^8) y la voy a convertir a 5 bits (32 tonos de grises o 2^5). Ese es el objetivo de la cuantización, al menos la cuantización en imágenes, el poder representar una imagen con diferente número de bits que la original tratando de que la imagen cuantizada se vea lo más parecido a la original, que obviamente es prácticamente imposible. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;clear;clc;    &lt;br /&gt;imagen = double(imread('boat.pgm')); &lt;/p&gt;    &lt;p&gt;figure(); imshow(uint8(imagen));    &lt;br /&gt;title('Imagen Original 8 bits'); &lt;/p&gt;    &lt;p&gt;[cols rows] = size(imagen); &lt;/p&gt;    &lt;p&gt;%--------------------------------------------------------    &lt;br /&gt;l = (2^3);     &lt;br /&gt;imQ = UniformQuantizationToImage(imagen,l); &lt;/p&gt;    &lt;p&gt;figure(); imshow(uint8(imQ));    &lt;br /&gt;title('Imagen Cuantizada 4 bits'); &lt;/p&gt;    &lt;p&gt;for i=1:6    &lt;br /&gt;   a = i*4;     &lt;br /&gt;   imWNoise = imagen + generateNoiseImage(cols,rows,-a,a);     &lt;br /&gt;   imR = UniformQuantizationToImage(imWNoise,l);     &lt;br /&gt;   figure(); imshow(uint8(imR));     &lt;br /&gt;   title(['Imagen con Ruido aleatorio[-a a] con a= ', num2str(a)]);     &lt;br /&gt;end     &lt;br /&gt;%--------------------------------------------------------&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;function imgQuantized=UniformQuantizationToImage(imgToQuantize,levels)   &lt;br /&gt;%Aplicar quantizacion uniforme a la imagen    &lt;br /&gt;imQ = floor(imgToQuantize.*((levels+1)/256))+1;    &lt;br /&gt;%Recuperar imagen en base a la cuantizada para mostrar    &lt;br /&gt;%la pérdida de información    &lt;br /&gt;imgQuantized = imQ.*((256/levels)-1);    &lt;br /&gt;end&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SbObX7BTE6I/AAAAAAAAADc/WPvYR1Fgp48/s1600-h/CuantizacionUnif_BLOG_01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_01" border="0" alt="CuantizacionUnif_BLOG_01" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SbObcvQaukI/AAAAAAAAADg/gO4FE7bhptc/CuantizacionUnif_BLOG_01_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SbObg4mvO4I/AAAAAAAAADk/6SB0-ISBrY8/s1600-h/CuantizacionUnif_BLOG_02%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_02" border="0" alt="CuantizacionUnif_BLOG_02" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SbObkzVNIhI/AAAAAAAAADo/pYO92XsDrRw/CuantizacionUnif_BLOG_02_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SbObqCc_wrI/AAAAAAAAADs/EsfLAJbDmzY/s1600-h/CuantizacionUnif_BLOG_03%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_03" border="0" alt="CuantizacionUnif_BLOG_03" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SbObtyhYusI/AAAAAAAAADw/tsNgfOvxKVQ/CuantizacionUnif_BLOG_03_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SbOb1WwQyuI/AAAAAAAAAD0/zwE_bREvRL8/s1600-h/CuantizacionUnif_BLOG_04%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_04" border="0" alt="CuantizacionUnif_BLOG_04" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SbOb7QM78PI/AAAAAAAAAD4/zvV8q9izA1Y/CuantizacionUnif_BLOG_04_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SbOcCX6XtoI/AAAAAAAAAD8/PYRd7Cx6elU/s1600-h/CuantizacionUnif_BLOG_05%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_05" border="0" alt="CuantizacionUnif_BLOG_05" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SbOcFx028pI/AAAAAAAAAEA/Qjbo2sUSpks/CuantizacionUnif_BLOG_05_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SbOcKStahoI/AAAAAAAAAEE/MThROyyeRfU/s1600-h/CuantizacionUnif_BLOG_06%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_06" border="0" alt="CuantizacionUnif_BLOG_06" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SbOcM5AmHnI/AAAAAAAAAEI/JF77ydQbiqM/CuantizacionUnif_BLOG_06_thumb%5B2%5D.png?imgmax=800" width="354" height="337" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SbOcS-kxdeI/AAAAAAAAAEM/ee0-4asjVMM/s1600-h/CuantizacionUnif_BLOG_07%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_07" border="0" alt="CuantizacionUnif_BLOG_07" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SbOcZkD-GDI/AAAAAAAAAEQ/q38hKKOQ7i0/CuantizacionUnif_BLOG_07_thumb%5B1%5D.png?imgmax=800" width="354" height="336" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SbOcf5deFnI/AAAAAAAAAEU/iuXKLOW34xg/s1600-h/CuantizacionUnif_BLOG_08%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuantizacionUnif_BLOG_08" border="0" alt="CuantizacionUnif_BLOG_08" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SbOcqXPsJjI/AAAAAAAAAEY/aBcer4qRgJI/CuantizacionUnif_BLOG_08_thumb%5B1%5D.png?imgmax=800" width="354" height="336" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-6203990271305943943?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/6203990271305943943/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/03/mucho-ruido-y-pocas-nueces-cuantizacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/6203990271305943943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/6203990271305943943'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/03/mucho-ruido-y-pocas-nueces-cuantizacion.html' title='Mucho ruido y pocas nueces. Cuantización escalar con Dithering aplicando ruido pseudo-aleatorio en MATLAB'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SbObcvQaukI/AAAAAAAAADg/gO4FE7bhptc/s72-c/CuantizacionUnif_BLOG_01_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1861864222020650818</id><published>2009-02-27T12:30:00.001-07:00</published><updated>2009-02-27T12:35:38.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complications'/><category scheme='http://www.blogger.com/atom/ns#' term='Quantization'/><category scheme='http://www.blogger.com/atom/ns#' term='English'/><title type='text'>Quantization by Dummies</title><content type='html'>&lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/Sag_VpoJhiI/AAAAAAAAADU/JNsAUlLaqgA/s1600-h/homersimpson%5B22%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="homersimpson" border="0" alt="homersimpson" src="http://lh6.ggpht.com/_iCpJOoYu6qU/Sag_Wp4_pSI/AAAAAAAAADY/Em99ic6Nu1E/homersimpson_thumb%5B23%5D.gif?imgmax=800" width="181" height="213" /&gt;&lt;/a&gt; Every time it happens to me, I remember the episode in &lt;em&gt;The Simpsons&lt;/em&gt; where Homer wants to get a raise when he was working at Bowlarama, he proposes to Al to triple the business, then you can see Homer reading “Advanced Marketing”, next scene the book is in trash bin and Homer is reading “Basic Marketing”, after that you can see a pile of books in the trash and Homer looking for the word “marketing” at the dictionary…&lt;/p&gt;  &lt;p align="justify"&gt;I had to read an technical article related to Quantization and present an explanation for the Digital Image Processing class in a workshop session. The teacher gave us a &lt;a target="_blank" href="http://www.visionbib.com/bibliography/image-proc155.html"&gt;list of articles related to quantization&lt;/a&gt; and she asked us to choose one of them. The first problem we faced was the availability of the papers, although the university has some kind of subscription with &lt;a target="_blank" href="http://www.ieee.org"&gt;IEEE&lt;/a&gt; and &lt;a target="_blank" href="http://www.sciencedirect.com"&gt;ScienceDirect&lt;/a&gt;, the number of articles available for us to download was very limited and the date of them was quite old. &lt;/p&gt;  &lt;p align="justify"&gt;While looking at the titles of the papers “the” question was arisen, which article should I choose? First of all looked at the articles that sounded good to me, then I realized that none of them were available from IEEE, and couldn’t connect to ScienceDirect from school. Then I started searching any article from the list available from IEEE was &lt;a target="_blank" href="http://ieeexplore.ieee.org/iel4/97/16366/00755427.pdf?arnumber=755427"&gt;“&lt;em&gt;Generalized Scalar Quantizer Design Using Dynamic Programming&lt;/em&gt;”&lt;/a&gt; (bear in mind that if you don’t have a subscription you can’t see the article). The article is three pages long, but I couldn’t get to understand it enough to make a presentation.&lt;/p&gt;  &lt;p align="justify"&gt;I gave up searching the articles from the list and started surfing with &lt;a target="_blank" href="http://www.google.com"&gt;Saint Google&lt;/a&gt;, I don’t remember the keywords I used to search, but I came up with &lt;a target="_blank" href="http://www.szit.bme.hu/~gya/publications/GyLi00.pdf"&gt;“Optimal Entropy-Constrained Scalar Quantization of a Uniform Source”&lt;/a&gt;. It’s funny because while writing this post I was looking for the link to this file and found that the one of the coauthors of the article, ANDRÁS GYÖRGY,&amp;#160; has a bunch of his papers published listed in &lt;a target="_blank" href="http://www.szit.bme.hu/~gya/publications/"&gt;his publication's page&lt;/a&gt;, are available to download and some of them are about quantization.&lt;/p&gt;  &lt;p align="justify"&gt;After that, troubles has just begun, I started reading the article, and realized that most of the ideas were unclear to me, then I had to go to the books to search for the definition of the term I was stuck with, but while reading the definition I found also some things that for the moment I wasn’t able to understand, besides that I couldn’t found any ‘for dummies’ book about digital image processing, go figure, and it’s obvious there is no such thing. So I was reading in circles, finally, I put some kind of order in my ideas and made a presentation with the concepts I got. Still, it wasn’t enough to be clear the concept proposed in the paper, at least for me.&lt;/p&gt;  &lt;p align="justify"&gt;The best thing that I recall from this exercise is that it helped me to understand that research is not easy, but reading and sharing the little knowledge acquired, is the only way to start learning new things, it opens the mind to a different level, because we can see the work other people involved in the same field is doing, and also get fresh ideas from our peers, remember that feedback is always good and there is no such thing as “constructive nor destructive” critics.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1861864222020650818?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1861864222020650818/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/quantization-by-dummies.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1861864222020650818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1861864222020650818'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/quantization-by-dummies.html' title='Quantization by Dummies'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iCpJOoYu6qU/Sag_Wp4_pSI/AAAAAAAAADY/Em99ic6Nu1E/s72-c/homersimpson_thumb%5B23%5D.gif?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3381794483892282093</id><published>2009-02-25T12:12:00.001-07:00</published><updated>2009-02-25T12:12:00.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compresión de Datos'/><category scheme='http://www.blogger.com/atom/ns#' term='SNR'/><category scheme='http://www.blogger.com/atom/ns#' term='PSNR'/><category scheme='http://www.blogger.com/atom/ns#' term='MSE'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>¿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</title><content type='html'>&lt;p align="justify"&gt;En la compresión de datos, lo que se busca presisamente es &lt;em&gt;comprimir&lt;/em&gt;, 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: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;Con pérdidas (Loosy):&lt;/strong&gt; 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.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;Sin pérdidas (Lossless):&lt;/strong&gt; 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.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;Una de las medidas más usadas en imágenes y audio es el promedio de errores cuadrados (&lt;em&gt;MSE:&lt;/em&gt; &lt;em&gt;mean square error&lt;/em&gt;):&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SaWX6Sw4keI/AAAAAAAAACI/PpG49U-dndk/s1600-h/MSE%5B25%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="MSE" border="0" alt="MSE" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SaWX7jRyz7I/AAAAAAAAACM/btEuVs6m2SI/MSE_thumb%5B10%5D.png?imgmax=800" width="260" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;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 (&lt;em&gt;SNR: Signal to Noise Ratio)&lt;/em&gt; y esta dada por:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SNR" border="0" alt="SNR" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SaWX710EaQI/AAAAAAAAACQ/0TF2faNymEY/SNR_thumb%5B5%5D.png?imgmax=800" width="147" height="89" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El SNR se mide comúnmente en escala logarítmica, en decibeles (dB) y se representa cómo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SaWX8Y9ai9I/AAAAAAAAACU/-3CBUrieDbc/s1600-h/SNR%28DB%29%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SNR(DB)" border="0" alt="SNR(DB)" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SaWX865cdxI/AAAAAAAAACY/JmZBWqhrLQ4/SNR%28DB%29_thumb%5B1%5D.png?imgmax=800" width="244" height="83" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;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 (&lt;em&gt;PSNR: Peak Signal to Noise Ratio) &lt;/em&gt;y se calcula de la siguiente manera:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh6.ggpht.com/_iCpJOoYu6qU/SaWX9OC4aDI/AAAAAAAAACc/4soCQzkUHVQ/s1600-h/PSNR%28dB%29%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="PSNR(dB)" border="0" alt="PSNR(dB)" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SaWX99FqNvI/AAAAAAAAACg/fOCl6eQDXpI/PSNR%28dB%29_thumb%5B1%5D.png?imgmax=800" width="244" height="70" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;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:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SaWX-M0ZpbI/AAAAAAAAACk/8MTWvbteyY4/s1600-h/Promedio%20de%20las%20diferencias%20absolutas%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Promedio de las diferencias absolutas" border="0" alt="Promedio de las diferencias absolutas" src="http://lh6.ggpht.com/_iCpJOoYu6qU/SaWX-Z5b7tI/AAAAAAAAACo/KxC9SDasbDE/Promedio%20de%20las%20diferencias%20absolutas_thumb%5B1%5D.png?imgmax=800" width="244" height="97" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Cuando la distorción es imperceptible entonces se calcula el valor de la magnitud del error:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/_iCpJOoYu6qU/SaWX_LJbRkI/AAAAAAAAACs/Bm_h4ZoREeM/s1600-h/Valor%20maximo%20de%20la%20magnitud%20del%20error%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Valor maximo de la magnitud del error" border="0" alt="Valor maximo de la magnitud del error" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SaWX_QOeijI/AAAAAAAAACw/HmrR10teafg/Valor%20maximo%20de%20la%20magnitud%20del%20error_thumb.png?imgmax=800" width="244" height="49" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;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. &lt;/p&gt;  &lt;p&gt;¿Capish?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3381794483892282093?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3381794483892282093/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/que-tan-gacha-se-ve-la-foto.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3381794483892282093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3381794483892282093'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/que-tan-gacha-se-ve-la-foto.html' title='¿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'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iCpJOoYu6qU/SaWX7jRyz7I/AAAAAAAAACM/btEuVs6m2SI/s72-c/MSE_thumb%5B10%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1448473757203681554</id><published>2009-02-24T02:13:00.000-07:00</published><updated>2009-02-26T10:42:18.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='Cuantización'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>¿Cómo demonios se supone que debo interpretar esto? Cuantización escalar uniforme de una imagen en MATLAB</title><content type='html'>&lt;p align="justify"&gt;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 &lt;a target="_blank" href="http://www.amazon.com/Image-Processing-Analysis-Machine-Vision/dp/053495393X"&gt;Image Processing, Analysis, and Machine Vision (Ed. Thompson, 2008, USA)&lt;/a&gt;, la transición entre los valores continuos de la función de la&amp;#160; 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.&amp;#160; &lt;/p&gt;  &lt;p align="justify"&gt;En este ejemplo vamos a trabajar con una imagen &lt;a target="_blank" href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;PGM&lt;/a&gt;, 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.&lt;/p&gt;  &lt;blockquote&gt;   &lt;ol&gt;     &lt;li&gt;&lt;font size="2" face="cou"&gt;%Lee imagene PGM &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imagen = double(imread('peppers.pgm')); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;%Crea variables temporales &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantized = zeros(512,512); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantizedToDisplay = zeros(512,512); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;n = 2; %Define bits para cuantización &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;figure(); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantizedToDisplay = ((imgQuantized)*(256/2^n)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imshow(uint8(imgQuantizedToDisplay)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;title(['Cuantización a ', num2str(n) ,' bits']); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;n = 4; %Define bits para cuantización &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;figure(); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantizedToDisplay = ((imgQuantized)*(256/2^n)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imshow(uint8(imgQuantizedToDisplay)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;title(['Cuantización a ', num2str(n) ,' bits']); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;n = 6; %Define bits para cuantización &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;figure(); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantized = floor(imagen/(256/(2^n)-1)); %Cuantizar &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imgQuantizedToDisplay = ((imgQuantized)*(256/2^n)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;imshow(uint8(imgQuantizedToDisplay)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font size="2" face="cou"&gt;title(['Cuantización a ', num2str(n) ,' bits']);&lt;/font&gt; &lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;pre style="margin-left: 20.2pt"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SaOc1vlytmI/AAAAAAAAABw/am-S9nuYWhs/s1600-h/Tarea4_Compresion_ParaBLOG_01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Tarea4_Compresion_ParaBLOG_01" border="0" alt="Tarea4_Compresion_ParaBLOG_01" src="http://lh3.ggpht.com/_iCpJOoYu6qU/SaOc-5TIjNI/AAAAAAAAAB0/TvjseeVaSA0/Tarea4_Compresion_ParaBLOG_01_thumb%5B2%5D.png?imgmax=800" width="509" height="484" /&gt;&lt;/a&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SabUXCxpPPI/AAAAAAAAAC4/xwxmun3su-w/s1600-h/Tarea4_Compresion_ParaBLOG_02%5B1%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Tarea4_Compresion_ParaBLOG_02" border="0" alt="Tarea4_Compresion_ParaBLOG_02" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SaOdXmXeXRI/AAAAAAAAAC8/t4ealX--QvU/Tarea4_Compresion_ParaBLOG_02_thumb.png?imgmax=800" width="493" height="468" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SaOdcm4CsCI/AAAAAAAAADE/rQAvQij8T8w/s1600-h/Tarea4_Compresion_ParaBLOG_03%5B1%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Tarea4_Compresion_ParaBLOG_03" border="0" alt="Tarea4_Compresion_ParaBLOG_03" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SaOdjRMY21I/AAAAAAAAADM/9vwDsWuKrqI/Tarea4_Compresion_ParaBLOG_03_thumb.png?imgmax=800" width="493" height="468" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;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.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1448473757203681554?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1448473757203681554/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/como-represento-esto-cuantizacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1448473757203681554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1448473757203681554'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/como-represento-esto-cuantizacion.html' title='¿Cómo demonios se supone que debo interpretar esto? Cuantización escalar uniforme de una imagen en MATLAB'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_iCpJOoYu6qU/SaOc-5TIjNI/AAAAAAAAAB0/TvjseeVaSA0/s72-c/Tarea4_Compresion_ParaBLOG_01_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-8288353118608271316</id><published>2009-02-23T01:10:00.001-07:00</published><updated>2009-02-23T01:19:13.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB'/><category scheme='http://www.blogger.com/atom/ns#' term='DFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Fourier'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>El impacto de una revelación inesperada</title><content type='html'>&lt;p align="justify"&gt;¿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&amp;#160; 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 .&lt;/p&gt;  &lt;p align="justify"&gt;Si tenemos una imagen en formato &lt;a title="Portable Gray Map Specification Home Page" target="_blank" href="http://netpbm.sourceforge.net/doc/pgm.html"&gt;PGM&lt;/a&gt;, 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:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="center"&gt;&lt;font size="2" face="ver"&gt;&lt;font color="#000000"&gt;imagen = imread(&lt;/font&gt;&lt;font color="#8080ff"&gt;'peppers.pgm'&lt;/font&gt;,&lt;font color="#8080ff"&gt;'pgm'&lt;/font&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;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 &lt;a title="DFT code" target="_blank" href="http://www.mathworks.com/matlabcentral/newsreader/view_thread/41005"&gt;aquí&lt;/a&gt;, 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:&lt;/p&gt;  &lt;blockquote&gt;   &lt;ol&gt;     &lt;li&gt;&lt;font color="#000000" size="2"&gt;function X=dft(x)&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;[sx1 sx2] =size(x); &lt;font color="#008000"&gt;%Obtener el tamaño de la matriz&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;t = [0:sx2-1];&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;%Calcular la base de tiempo&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;f = [0:(1/sx2):(1-(1/sx2))];&amp;#160;&amp;#160;&amp;#160; &lt;font color="#008000"&gt;%Calcular las frecuencias &lt;/font&gt;&lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;t = t(:); &lt;font color="#008000"&gt;% Formatear 't' en vector columna&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;x = x(:); &lt;font color="#008000"&gt;% Formatear 'x' en vector columna&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;f = f(:); &lt;font color="#008000"&gt;% Formatear 'f' en vector columna&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;W = exp(-2*pi*j * f*t');&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2"&gt;X = W * double(x);&lt;/font&gt; &lt;/li&gt;   &lt;/ol&gt;    &lt;p align="center"&gt;&lt;font color="#000000" size="2"&gt;&lt;font color="#c0c0c0"&gt;Código 1.&lt;/font&gt; Función que realiza la DFT en MATLAB&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Las últimas dos líneas de código representan en esencia la transformada de fourier. Tengo que hacer referencia &lt;a target="_blank" href="http://dipuacj.blogspot.com/2009/02/la-temible-transformada-de-fourier.html"&gt;al post que escribí iniciando este tema&lt;/a&gt;, ya que no recuerdo de que fuente tomé la ecuación en el post anterior, pero noto que es diferente en cuanto &lt;strong&gt;&lt;em&gt;X(k)&lt;/em&gt;&lt;/strong&gt;&amp;#160; y &lt;strong&gt;&lt;em&gt;x(n) &lt;/em&gt;&lt;/strong&gt;está representadas como &lt;strong&gt;&lt;em&gt;X(k+1)&lt;/em&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;em&gt;x(n+1)&lt;/em&gt;&lt;/strong&gt;, creo que la diferencia radica en donde se tomen los coeficientes. &lt;/p&gt;  &lt;p align="justify"&gt;Ok, otra vez, la ecuación siguiente nos muestra la transformada de fourier discreta (Tomada de: &lt;a title="Liga de la descripción del libro en Amazon" target="_blank" href="http://www.amazon.com/Practical-Digital-Signal-Processing-Technology/dp/0750657987"&gt;Practical Digital Signal Processing for Engineers and Technicians&lt;/a&gt;, pp 63)&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SaJZ0A1tEEI/AAAAAAAAABg/EUIcoqbYVyo/s1600-h/DFT%5B11%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DFT" border="0" alt="DFT" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SaJZ0nK7IpI/AAAAAAAAABk/-tlaix6AmaY/DFT_thumb%5B7%5D.jpg?imgmax=800" width="368" height="99" /&gt;&lt;/a&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;Ecuación 1&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Ahora, viendo el programa relacionamos la línea 8 con lo siguiente:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_iCpJOoYu6qU/SaJZ1CeluzI/AAAAAAAAABo/OiT2k8cSa1A/s1600-h/w%5B23%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="w" border="0" alt="w" src="http://lh5.ggpht.com/_iCpJOoYu6qU/SaJZ2b-1leI/AAAAAAAAABs/WW_FYecJrSU/w_thumb%5B20%5D.jpg?imgmax=800" width="81" height="47" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;em&gt;&lt;font color="#c0c0c0"&gt;Ecuación 2&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Podemos observar de la ecuación anterior que &lt;strong&gt;&lt;em&gt;k&lt;/em&gt;&lt;/strong&gt; es el equivalente a la líneas 3 y&lt;strong&gt;&lt;em&gt;&amp;#160; n/N&lt;/em&gt;&lt;/strong&gt; es la línea 4. Esto es, &lt;strong&gt;&lt;em&gt;k&lt;/em&gt;&lt;/strong&gt; es el ‘tiempo’ o mas bien dicho cada muestra en la imagen&amp;#160; y las frecuencias en las que contienen son &lt;strong&gt;&lt;em&gt;n/N&lt;/em&gt;&lt;/strong&gt;. (Si, esto me sigue causando problemas emocionales todavía). En la última línea del código anterior (la nueve) tenemos las muestras &lt;strong&gt;&lt;em&gt;x(n)&lt;/em&gt;&lt;/strong&gt; con los componentes de frecuencia (lo representado en la ecuación 2).&lt;/p&gt;  &lt;blockquote&gt;   &lt;ol&gt;     &lt;li&gt;&lt;font size="2" face="ver"&gt;&lt;font color="#000000"&gt;imagen = imread(&lt;/font&gt;&lt;font color="#8080ff"&gt;'peppers.pgm'&lt;/font&gt;,&lt;font color="#8080ff"&gt;'pgm'&lt;/font&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;imfinfo(&lt;font color="#8080ff"&gt;'peppers.pgm'&lt;/font&gt;) &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;figure(1); imshow(imagen); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;[s1 s2]= size(imagen); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;dftimagen = zeros(s1); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&lt;font color="#8080ff"&gt;for&lt;/font&gt; i=1:s2 &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&amp;#160;&amp;#160;&amp;#160; dftimagen(i,:) = dft(imagen(i,:)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&lt;font color="#8080ff"&gt;end&lt;/font&gt; &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;dftimagen= dftimagen.'; &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&lt;font color="#8080ff"&gt;for&lt;/font&gt; i=1:s2 &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&amp;#160;&amp;#160;&amp;#160; dftimagen(i,:) = dft(dftimagen(i,:)); &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;&lt;font color="#8080ff"&gt;end&lt;/font&gt; &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;dftimagen = dftimagen.'; &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#000000" size="2" face="Verdana"&gt;figure(2);imshow(uint8(ifft2(dftimagen)));&lt;/font&gt; &lt;/li&gt;   &lt;/ol&gt;   &lt;font size="2"&gt;&lt;font color="#000000"&gt;&lt;font color="#c0c0c0"&gt;Código 2.&lt;/font&gt; Programa que realiza la DFT a una imagen de 8 bits escala de grises en MATLAB &lt;/font&gt;&lt;/font&gt;&lt;/blockquote&gt;  &lt;p align="justify"&gt;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).&amp;#160; 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.&lt;/p&gt;  &lt;p align="justify"&gt;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. &lt;/p&gt;  &lt;p align="justify"&gt;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)&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;Isn’t ironic? Don’t you think?&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-8288353118608271316?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/8288353118608271316/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/el-impacto-de-una-revelacion-inesperada.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8288353118608271316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/8288353118608271316'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/el-impacto-de-una-revelacion-inesperada.html' title='El impacto de una revelación inesperada'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SaJZ0nK7IpI/AAAAAAAAABk/-tlaix6AmaY/s72-c/DFT_thumb%5B7%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3074032778326808198</id><published>2009-02-20T16:00:00.001-07:00</published><updated>2009-02-23T01:15:12.118-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complicaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>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</title><content type='html'>&lt;p align="justify"&gt;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 &lt;a target="_blank" href="http://es.wikipedia.org/wiki/LaTeX"&gt;LaTEX&lt;/a&gt; (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.&lt;/p&gt;  &lt;p align="justify"&gt;Haciendo uso de San Google, fui a parar con un par de herramientas para insertar código de &lt;a target="_blank" href="http://wolverinex02.googlepages.com/emoticonsforblogger2"&gt;LaTEX en blogger&lt;/a&gt;, 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,&amp;#160; si no que se ven como imágenes sin ningun tipo de orden dentro del párrafo. &lt;/p&gt;  &lt;p align="justify"&gt;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 &lt;a target="_blank" href="http://forum.yourequations.com/viewtopic.php?f=4&amp;amp;t=14"&gt;código en HTML&lt;/a&gt; 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.&lt;/p&gt;  &lt;p align="justify"&gt;Y sólo para concluir, – así es corazón de mi vida, siempre has tenido razón, ‘inches ingenieretes no somos nada prácticos &lt;/p&gt;  &lt;p align="justify"&gt;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)… &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3074032778326808198?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3074032778326808198/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/blogger-windows-live-writer-windows-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3074032778326808198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3074032778326808198'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/blogger-windows-live-writer-windows-y.html' title='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'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-543743690974798426</id><published>2009-02-19T12:22:00.001-07:00</published><updated>2009-02-19T12:28:24.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Fourier'/><category scheme='http://www.blogger.com/atom/ns#' term='English'/><title type='text'>The feared Discrete Fourier Transform (aka:DFT)</title><content type='html'>&lt;p align="justify"&gt;Why we should care about the Discrete Fourier Transform?&lt;/p&gt;  &lt;p align="justify"&gt;I will start talking about the applications in which DFT is used, as &lt;a target="_blank" href="http://www.imageprocessingplace.com"&gt;Gonzalez&lt;/a&gt; says in his image processing book, besides being the cornerstone in linear filtering, it offers considerable flexibility in the design and implementation of filtering solutions in areas as image compression, image restoration, image enhancement, and many other applications of practical interest. Now, we are ready to cheerfully start studying the DFT in deep. (Yeah, right)&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p align="justify"&gt;By definition, the DFT is represented as follows:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DFT. Equation 1" border="0" alt="DFT. Equation 1" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SZy08m7VBtI/AAAAAAAAABM/aHwRo9NcQXA/DFT_thumb[6].gif?imgmax=800" /&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Mmmm, and as you easily can see from the equation above, :P, we have:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;X(k)&lt;/strong&gt;&lt;/em&gt; = Is the Discrete Fourier Transform of our signal, is its representation in the frequency domain (what?)&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;&lt;em&gt;&lt;strong&gt;x(n)&lt;/strong&gt;&lt;/em&gt; = Is our signal in the spatial domain, ie. an audio signal&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;So, if we see the equation, each sample &lt;em&gt;&lt;strong&gt;X(k)&lt;/strong&gt;&lt;/em&gt; will be the sum of the multiplication of all the input signal values by the frequency components of the signal.&amp;#160; Yes, is that &lt;em&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/em&gt; raised to &lt;em&gt;&lt;strong&gt;two pi&lt;/strong&gt;&lt;/em&gt; divided by &lt;em&gt;&lt;strong&gt;N&lt;/strong&gt; times&lt;/em&gt;&amp;#160;&lt;strong&gt;&lt;em&gt;minus&lt;/em&gt; &lt;em&gt;i&lt;/em&gt;&lt;/strong&gt; times &lt;em&gt;&lt;strong&gt;k&lt;/strong&gt;&lt;/em&gt; times &lt;em&gt;&lt;strong&gt;n.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Without looking for more troubles with efficiency measurement algorithms, we can see (not so clearly) that while we have more samples in our signal, the amount of multiplications and additions is raised exponentially, that inconvenience was solved with the FFT, but that is something that I will not touch so far.&lt;/p&gt;  &lt;p align="justify"&gt;Here I stop with this little explanation of the DFT, but I will continue with an example of it coded in MATLAB in a later post.&lt;/p&gt;  &lt;p align="justify"&gt;(So far I can’t get to understand this)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-543743690974798426?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/543743690974798426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/feared-discrete-fourier-transform.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/543743690974798426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/543743690974798426'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/feared-discrete-fourier-transform.html' title='The feared Discrete Fourier Transform (aka:DFT)'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SZy08m7VBtI/AAAAAAAAABM/aHwRo9NcQXA/s72-c/DFT_thumb[6].gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1895598558211479549</id><published>2009-02-19T12:00:00.001-07:00</published><updated>2009-02-20T16:01:26.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complications'/><category scheme='http://www.blogger.com/atom/ns#' term='DFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Fourier'/><category scheme='http://www.blogger.com/atom/ns#' term='English'/><title type='text'>I need the same thing that Fourier was smoking…</title><content type='html'>&lt;p align="justify"&gt;Definitely I don’t understand the Discrete Fourier Transform, and even more, the troubles are elevated to square when I try to comprehend it applied to an image, ha!&lt;/p&gt;  &lt;p align="justify"&gt;As Mr. Marley used to say…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1895598558211479549?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1895598558211479549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/i-need-same-thing-that-fourier-was.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1895598558211479549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1895598558211479549'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/i-need-same-thing-that-fourier-was.html' title='I need the same thing that Fourier was smoking…'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1274096184184520991</id><published>2009-02-19T11:49:00.001-07:00</published><updated>2009-02-20T16:02:19.706-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complicaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='DFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Fourier'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>Necesito lo que fumaba Fourier…</title><content type='html'>&lt;p align="justify"&gt;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á!&lt;/p&gt;  &lt;p&gt;Como el Sr. Marley solía decir…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1274096184184520991?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1274096184184520991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/necesito-lo-que-fumaba-fourier.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1274096184184520991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1274096184184520991'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/necesito-lo-que-fumaba-fourier.html' title='Necesito lo que fumaba Fourier…'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-98301913953967398</id><published>2009-02-18T18:25:00.001-07:00</published><updated>2009-02-19T12:24:16.211-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FFT'/><category scheme='http://www.blogger.com/atom/ns#' term='DFT'/><category scheme='http://www.blogger.com/atom/ns#' term='Fourier'/><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>La temible Transformada de Fourier Discreta (aka: DFT)</title><content type='html'>&lt;p align="justify"&gt;¿Por qué nos puede llegar a importar la transformada de Fourier Discreta?&lt;/p&gt;  &lt;p align="justify"&gt;Voy a empezar hablando de las aplicaciones dadas a la DFT, como lo dice &lt;a target="_blank" href="http://www.imageprocessingplace.com"&gt;Gonzalez&lt;/a&gt; en su libro de procesamiento de imagenes, aparte de ser la piedra angular en los filtros lineales, ofrece una considerable flexibilidad&amp;#160; 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á)&lt;/p&gt;  &lt;p&gt;Por definición, la DFT se representa de la siguiente manera:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iCpJOoYu6qU/SZy08J5a-tI/AAAAAAAAABE/TtgQSznxugs/s1600-h/DFT%5B8%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DFT. Ecuación 1" border="0" alt="DFT Ecuation 1" src="http://lh4.ggpht.com/_iCpJOoYu6qU/SZy08m7VBtI/AAAAAAAAABM/aHwRo9NcQXA/DFT_thumb%5B6%5D.gif?imgmax=800" width="377" height="88" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Mmmm, &lt;em&gt;y como se puede observar claramente en la ecuación anterior&lt;/em&gt;, (jeje, no!, ya en serio) tenemos que:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;em&gt;&lt;strong&gt;X(k)&lt;/strong&gt;&lt;/em&gt; = Es la transformada de fourier discreta de nuestra señal, es decir su representación en el dominio de la frecuencia. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;em&gt;&lt;strong&gt;x(n)&lt;/strong&gt;&lt;/em&gt; = Es nuestra señal en el dominio espacial, por ejemplo una señal de audio &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Así es que si vemos detenidamente, cada muestra &lt;em&gt;&lt;strong&gt;X(k)&lt;/strong&gt;&lt;/em&gt; 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 &lt;em&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/em&gt; elevada a la &lt;em&gt;&lt;strong&gt;dos pi&lt;/strong&gt;&lt;/em&gt; sobre &lt;em&gt;&lt;strong&gt;N&lt;/strong&gt; &lt;/em&gt;multiplicada por &lt;strong&gt;&lt;em&gt;menos&lt;/em&gt; &lt;em&gt;i&lt;/em&gt;&lt;/strong&gt; multiplicada por &lt;em&gt;&lt;strong&gt;k&lt;/strong&gt;&lt;/em&gt; multiplicada por &lt;em&gt;&lt;strong&gt;n.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;(Hasta ahorita sigo sin entenderle).&lt;/p&gt;  &lt;p align="right"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;PD: Feliz cumpleaños Tris!!!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-98301913953967398?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/98301913953967398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/la-temible-transformada-de-fourier.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/98301913953967398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/98301913953967398'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/la-temible-transformada-de-fourier.html' title='La temible Transformada de Fourier Discreta (aka: DFT)'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iCpJOoYu6qU/SZy08m7VBtI/AAAAAAAAABM/aHwRo9NcQXA/s72-c/DFT_thumb%5B6%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-3907547002066121401</id><published>2009-02-18T13:41:00.001-07:00</published><updated>2009-02-18T15:47:17.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='English'/><title type='text'>Begining</title><content type='html'>&lt;blockquote&gt;   &lt;p align="right"&gt;&lt;span style="font-size: 85%"&gt;to Ivonne&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Time to begin.&lt;/p&gt;  &lt;p align="justify"&gt;The objective of this blog is to share ideas, homework, articles, essays, events, links and any thing related to the development of my thesis in Master of Science in Electrical Engineering at the University of Juarez. This is meant to make available in a global manner the knowledge that could be generated at some point, and to create also a hub of discussion regarding topics related to digital image processing.&lt;/p&gt;  &lt;p align="justify"&gt;The main idea of the thesis is based on the Wavelet transform. The main purpose of a transform in the digital signal processing world, is to change in domain a signal, this is, represent in a “different” way a signal; with the objective of being able to see characteristics that would not be noticeable otherwise into the original domain. There are a bunch of transforms available; among them is the Fourier Transform, the Discrete Cosine Transform, the Wavelet, the Contourlet, etc.&lt;/p&gt;  &lt;p align="justify"&gt;Based on the fact that a domain transform an alternative approach can be achieved to the analysis of the signal, in comparison with the representation in the original domain. A characterization of images is pretended (based on the fact that an image is indeed a 2D signal) in the transformed domain, using in this particular case the Wavelet transform and be able to obtain in a systematic manner information that could be used in the different fields of digital image processing, like in the patter recognition as an example.&lt;/p&gt;  &lt;p align="justify"&gt;This blog is born due to the response of a personal need of clarify all the ideas that are brought in the way towards the making of the thesis project, perhaps the focus of this blog is oriented to the academic world, but it is obvious that can not be limited only to serve that purpose. I want to thank deeply to the love of my life, which always gives me her support and with out herself I would not never think about writing this Blog.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-3907547002066121401?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/3907547002066121401/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/begining.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3907547002066121401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/3907547002066121401'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/begining.html' title='Begining'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3919270335168988083.post-1982725443075631845</id><published>2009-02-18T01:51:00.001-07:00</published><updated>2009-02-18T15:47:50.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Español'/><title type='text'>Inicio</title><content type='html'>&lt;blockquote&gt;   &lt;p align="right"&gt;&lt;span style="font-size: 85%"&gt;A Ivonne&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Cuando es tiempo de iniciar.&lt;/p&gt;  &lt;p align="justify"&gt;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 &lt;a target="_blank" href="http://www.uacj.mx/IIT/IEC/MCiencias_Ing_Electronica/default.htm"&gt;Maestría en Ciencias en Ingeniería Eléctrica&lt;/a&gt; en la &lt;a target="_blank" href="http://www.uacj.mx/"&gt;Universidad Autónoma de Ciudad Juárez&lt;/a&gt;. 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.&lt;/p&gt;  &lt;p align="justify"&gt;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. &lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;p align="justify"&gt;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.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3919270335168988083-1982725443075631845?l=dipuacj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dipuacj.blogspot.com/feeds/1982725443075631845/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dipuacj.blogspot.com/2009/02/inicio.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1982725443075631845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3919270335168988083/posts/default/1982725443075631845'/><link rel='alternate' type='text/html' href='http://dipuacj.blogspot.com/2009/02/inicio.html' title='Inicio'/><author><name>Gustavo Ramírez</name><uri>http://www.blogger.com/profile/18091498297253267023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-niQsCwIgBdI/TbuXhM1DAXI/AAAAAAAAAh0/vh43VRUbWeE/s220/Avatar_BW.jpg'/></author><thr:total>2</thr:total></entry></feed>
