tag:blogger.com,1999:blog-13106975254694019822024-03-19T05:48:08.199-07:00Visión Computacional y LaboratorioEduardo TrianaEduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.comBlogger38125tag:blogger.com,1999:blog-1310697525469401982.post-18403777310890291062013-05-20T19:02:00.000-07:002013-05-23T20:42:14.493-07:00Proyecto Final <div style="text-align: center;">
<b><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Reconocimiento de caracteres</span></span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola a todos mis compañeros y gente que visita mi blog, esta entrada corresponde a mi proyecto final de la materia de visión computacional, consiste en el reporte del mismo y contiene los siguientes temas (establecidos por la maestra, Dra. Elisa Schaeffer): </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;"><b>REPORTE</b></span><br /> </span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="color: #666666;"> Propósito / justificación </span></span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_v3qLzfaZJQ7cxX1byhHVDmLcr3F7PHzAT4eZsKoexl3zbEd3894q9UUzUpmI65BTvwBJONCVAGAYHyYj1n5CUfkj63VjNGSWJExVgVtDQXUAf-uzIiAn2xuwyQCtoGfb66Mo8c_lpVd/s1600/im7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="47" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_v3qLzfaZJQ7cxX1byhHVDmLcr3F7PHzAT4eZsKoexl3zbEd3894q9UUzUpmI65BTvwBJONCVAGAYHyYj1n5CUfkj63VjNGSWJExVgVtDQXUAf-uzIiAn2xuwyQCtoGfb66Mo8c_lpVd/s200/im7.png" width="200" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3I8O183kCsZN11MhTvym41ZA_2HBfGeWMg_D9wihfadVh_6t9uUcdEcBf6HY0ylC4gwcosgyjFFC0XOTHONQ2tkAlc5TI03mBmgih5WJGt8U4YGcS87GNRUYQBIME5GAMpMBwPAALU5lv/s1600/im6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3I8O183kCsZN11MhTvym41ZA_2HBfGeWMg_D9wihfadVh_6t9uUcdEcBf6HY0ylC4gwcosgyjFFC0XOTHONQ2tkAlc5TI03mBmgih5WJGt8U4YGcS87GNRUYQBIME5GAMpMBwPAALU5lv/s200/im6.jpg" width="200" /></a></div>
<div dir="ltr" id="docs-internal-guid-3be69896-c04b-023c-884f-502b70cc5346" style="line-height: 1; margin-bottom: 0pt; margin-top: 6pt; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El
propósito de mi proyecto es principalmente para digitalizar documentos
que tengamos en papel, esto ahorra tiempo de escritura en el caso de que
se vayan a transcribir documentos largos y además evita el trabajo de
hacerlo.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hay
que reconocer que el sistema no es perfecto y podrían existir errores
en el reconocimiento de algunos caracteres, pero aún así facilita la
transcripción de documentos muy largos como la transcripción de libros
completos.</span></div>
<span style="font-family: Arial,Helvetica,sans-serif;">De
hecho el motor de reconocimiento de caracteres que usé es desarrollado
actualmente por google para su proyecto de digitalización de libros
(Google books)</span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="color: #666666;"> Diseño del software </span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El software lo dividí en 4 partes que consisten en la entrada de los datos, preprocesamiento, el reconocimiento y la salida del sistema, a continuación detallo cada una de las tres partes, además de un diagrama que explica el funcionamiento en conjunto:</span></div>
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Entrada: La entrada de los datos (las imágenes) las obtengo por medio de la cámara web del ordenador, primero abro la captura de la cámara con la facilidad que provee OpenCv, después capturo una imagen presionando "backspace".</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Preprocesamiento: Luego de obtener la imagen con el texto a reconocer (fotografía sosteniendo la hoja o el libro a transcribir), abro la imagen dentro de una ventana de OpenCv, después en la misma ventana marco con el mouse en un rectángulo la zona de interés, en este caso el texto a reconocer. </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Reconocimiento: Después de obtener la nueva imagen con la zona de interes, le paso esta nueva imagen al motor de reconocimiento "tesseract - OCR", en específico uso el método "image_to_string" y este método llama al ejecutable "tesseract" . El método me regresa el texto y simplemente lo almaceno en una variable. </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Salida del sistema: El resultado entregado por el motor de reconocimiento lo almaceno en un archivo de texto y luego llamo a un shell que realicé para que abriera dicho archivo en un gedit (de esta manera le facilito la tarea al usuario).</span></li>
</ul>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQ9zGfUJlakrVw1qFJY3adfYG8Lhop_tzzMRP2yC7K3qeI72Vo-ANk_4oRDEhB8izzZYdhlSp3xseFqz990yJQfX7xqf98YwMteX3ih5PmApWRBzMXq3c5YE0XZg-fy9LR4bV3M8uGRTi/s1600/im8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQ9zGfUJlakrVw1qFJY3adfYG8Lhop_tzzMRP2yC7K3qeI72Vo-ANk_4oRDEhB8izzZYdhlSp3xseFqz990yJQfX7xqf98YwMteX3ih5PmApWRBzMXq3c5YE0XZg-fy9LR4bV3M8uGRTi/s640/im8.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="color: #666666; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"> Librerías utilizadas </span></span></div>
<div style="text-align: justify;">
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Las librerías que yo utilicé fueron pytesser, os, PIL, OpenCV, pyscreenshot, entre otras, a continuación describiré para qué utilicé cada una de ellas.</span></div>
<div style="text-align: justify;">
<pre class="brush:py">from pytesser import *
import os
import Image
import cv2.cv as cv
import pyscreenshot as ImageGrab
from PIL import *
</pre>
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><i><b><span style="color: #073763;">PyTesser</span></b></i>: Utilicé el motor "tesseract - OCR" de pytesser para realizar el reconocimiento de los caracteres presentes en una imagen (la imagen la obtuve de la cámara web). Pytesser cuenta con diversos módulos de reconocimiento, yo utilicé el método Image_to_string para obtener la cadena reconocida. El motor de reconocimiento de caracteres "tesseract" es actualmente desarrollado por Google, y usado por ellos mismos en su proyecto "Google Books"; inicialmente tesseract fue desarrollado por la compañía HP.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #073763;"><i><b>Os</b></i></span>: El módulo os lo utilicé para poder emplear funciones del sistema operativo, por medio del módulo os abrí un shell que a su vez abre gedit con mi archivo de texto de salida dentro.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #073763;"><i><b>PIL</b></i></span>: El módulo de Python Image Library lo usé para cargar las imágenes con las que trabajé, además de tener un fácil acceso a cada uno de los píxeles y dimensiones de las mismas. Al tener acceso a los pixeles de las imágenes pienso realizar futuros filtros para quitar ruidos y manchas que impiden el correcto reconocimiento.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #073763;"><i><b>OpenCV</b></i></span>: El módulo de OpenCV lo usé para cargar la funcionalidad de cámara web y también para aplicar los filtros de escala de grises y binarización a las imágenes obtenidas, con el fin de presentar imágenes más sencillas y "fáciles" de reconocer por el motor "tesseract - OCR".</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #073763;"><i><b>Pyscreenshot</b></i></span>: Este módulo lo usé para poder cortar sobre la imagen obtenida de la cámara web el aŕea de interés del usuario. Tomando en cuenta que no todo lo que está presente en el docuemento es relevante (por ejemplo, dibujos, gráficas, etc).</span></li>
</ul>
</div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #666666;"><span style="font-size: large;"><span style="font-size: x-large;"> Descripción textual y diagramas de los algoritmos desarrollados </span></span></span></span></div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;"><br />Entrada del sistema: </span></b></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">La entrada del sistema la realizo por medio de la cámara web. Al iniciar el programa abro la ventana de la cámara web para que el usuario ponga a la vista de la cámara el documento en papel, luego por medio de la tecla "backspace" el usuario captura la imagen para pasar al módulo de cortado de la imagen. A continuación una imagen del proceso.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI-zeLLex4e-cy3Slri8G6E2OguTZFDlK-UBY67TfzGxTmN8g60ic7AMfwSOyz2vo1LBmnxkFlo6Q0jOUBYNOAk4qr-qMROuvv32LGw04LVy0EyR8CloMbLmU3UKwvHWStWJPqrYbN2iuw/s1600/salida598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI-zeLLex4e-cy3Slri8G6E2OguTZFDlK-UBY67TfzGxTmN8g60ic7AMfwSOyz2vo1LBmnxkFlo6Q0jOUBYNOAk4qr-qMROuvv32LGw04LVy0EyR8CloMbLmU3UKwvHWStWJPqrYbN2iuw/s400/salida598.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b><span style="font-size: large;"><span style="font-family: Arial,Helvetica,sans-serif;">Cortar contenido relevante: </span></span></b></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para obtener solo el contenido relevante de la imagen o del documento en papel del usuario realicé un módulo que te permite cortar la imagen por medio de mouse, eliminando de la imagen fotografías, imágenes o gráficas que no nos interesan (o que no puede procesar el algoritmo de reconocimiento de caracteres). A continuación una imagen del proceso.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_iDNZDWF-1tUckc45k3_xUcILUYiH5IL6spL6mO0s7hi0CJ1hcPpGbyK8TzWPCcqGJlsfwNuMIY9u9-Vxb9bHZp5aKsRPupV9Gj2ixWyJjgwvi_MFLA_8gxi5QmJE_-q6QN2soaFDq36/s1600/recortada.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_iDNZDWF-1tUckc45k3_xUcILUYiH5IL6spL6mO0s7hi0CJ1hcPpGbyK8TzWPCcqGJlsfwNuMIY9u9-Vxb9bHZp5aKsRPupV9Gj2ixWyJjgwvi_MFLA_8gxi5QmJE_-q6QN2soaFDq36/s400/recortada.png" width="400" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br />
<b><span style="font-size: large;"><span style="font-family: Arial,Helvetica,sans-serif;">Escala de grises y binarización:</span></span></b></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para presentarle al motor de reconocimiento de caracteres "tesseract - OCR" imágenes más sencillas de reconocer, primero paso por escala de grises y binarización la imagen, ya que obtenía mucho mejores resultados después de correr estos fitros (para esto hice uso de OpenCV). En un futuro tengo pensado implementar más filtros, como un limpiador para quitar ruido de la imagen. A continuación una imagen del proceso:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT1zdN9N_YuxqC8nhRBNGeGxUHY2S7TNF2pJ3_1fF_DfIb_7q62_hS7FFs6Ggwky3PwIbf4pyk2Njx1GbvTNemRvApRIqefQzx95xLcDbAPjSg4Hb9ciJUCo4IibfVeK3AY87ARpdNZOsc/s1600/out.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT1zdN9N_YuxqC8nhRBNGeGxUHY2S7TNF2pJ3_1fF_DfIb_7q62_hS7FFs6Ggwky3PwIbf4pyk2Njx1GbvTNemRvApRIqefQzx95xLcDbAPjSg4Hb9ciJUCo4IibfVeK3AY87ARpdNZOsc/s400/out.png" width="400" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgReJkvo2-CO8xscZ9HBWfY6PtgI10kPPW5HWMJMt7dkd4LNJT-KHQMoMtl8Oer3UultTBpQyKi71PGbRyNXfnLDIlEvRe9T2srTn3Kvbd8dLDj1atknvCkzcViG533iL0I0OjcC37kU48z/s1600/bw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgReJkvo2-CO8xscZ9HBWfY6PtgI10kPPW5HWMJMt7dkd4LNJT-KHQMoMtl8Oer3UultTBpQyKi71PGbRyNXfnLDIlEvRe9T2srTn3Kvbd8dLDj1atknvCkzcViG533iL0I0OjcC37kU48z/s400/bw.png" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b><span style="font-size: large;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /><br />Salida del sistema:</span></span></b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para finalizar uso el módulo PyTesser para el reconocimiento de los caracteres, el módulo PyTesser cuenta con distintos métodos para distintas funcionalidades, en mi caso usé el método Image_to_String, que, después de pasarle como parámetro mi imagen previamente filtrada, el método llama al ejecutable tesseract.exe que es el que se encarga del reconocimiento. Luego me entrega la cadena de caracteres que guardo en un archivo de texto. Después de esto, por medio de la librería "os" mando llamar a un shell que se encarga de abrir gedit con mi archivo de texto titulado "salida.txt" (para mayor facilidad y comodiad al usuario). A continuación una imagen del proceso.</span><br />
<br /></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhro8b7SUfpDg71Nw9VKKCDmNVfb-AgOzG1dwRM5t6ey0zGwumlHg8cwgpa2mEJ3BVwcdAj_sMUF7_XxQothPMxkoGHHUh8hESh1rUpGVeZiUfs6iTE0XMMlE6tTtJN9hRz5mh-PZPmkT7C/s1600/im14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhro8b7SUfpDg71Nw9VKKCDmNVfb-AgOzG1dwRM5t6ey0zGwumlHg8cwgpa2mEJ3BVwcdAj_sMUF7_XxQothPMxkoGHHUh8hESh1rUpGVeZiUfs6iTE0XMMlE6tTtJN9hRz5mh-PZPmkT7C/s400/im14.png" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Si comparamos
con la imagen de entrada, podemos notar que solamente hubo un error,
pero conforme disminuía el tamaño de las letras del documento
naturalmente se presentaban más errores, esto lo compruebo más adelante
en la evaluación del desempeño. </span><span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHTNJBMdlwixSS1xTFRgJmgzyz05crcCSp2rNARfk5cOM5ILFHbxSOvu4oJEOu2GFTAZg02QFweqZjllEdJ33xIqcS7rz6gsFVf898jKwSy1frk7-hTuC6WTi8nUSfIE0VULtx43ap-s9B/s1600/Untitled+drawing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHTNJBMdlwixSS1xTFRgJmgzyz05crcCSp2rNARfk5cOM5ILFHbxSOvu4oJEOu2GFTAZg02QFweqZjllEdJ33xIqcS7rz6gsFVf898jKwSy1frk7-hTuC6WTi8nUSfIE0VULtx43ap-s9B/s640/Untitled+drawing.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Demostración de funcionamiento, recomendable ponerlo en fullscreen)</span></b></div>
<center>
<iframe allowfullscreen="" frameborder="0" height="515" src="http://www.youtube.com/embed/wZiK96t0rSw" width="620"></iframe>
</center>
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="color: #666666;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span><br />
<center>
<span style="color: #666666;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Pruebas con distintas imágenes(distinto contenido y tamaño de fuente<span style="font-size: x-large;">)</span> </span></span></span></center>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bien, para realizar las pruebas del algoritmo de reconocimiento de caracteres (tesseract - OCR) utilicé 4 distintas imágenes; distintas referente al contenido y al tamaño de la fuente. Lo que se podía apreciar a simple vista es que el algoritmo de reconocimiento batallaba más conforme iba reduciendo el tamaño de la fuente de los documentos.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para poder reconocer cada una de las palabras en los textos de fuentes pequeñas necesité acercar demasiado el documento a la cámara web, pero aún así los caracteres resultaban demasiado pequeños para el algoritmo, y el reconocimiento era bastante defectuoso, o de plano no se realizaba el reconocimiento.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación les muestro las imágenes de entrada, los pasos de procesamiento y las salidas de cada uno de los 4 documentos. Comencé realizando las pruebas con documentos de tamaño de fuente grande (tamaño 25), luego fui decrementando el tamaño de 5 en 5 hasta llegar a 10 (todos los documentos escritos en letra Arial).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba 1 - Tamaño de fuente 25.</span></b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen capturada mediante la webcam) </span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ITcaXdKjI0X03bqIzWMicrZinT3zxYwUvbIrinPEFmJCS1xYH_Ozy260jVpX7_JwbZrcPT-2W8n3mwL-ICCy0DhOXLqgBsbpZOybmMtGYoxmFEVXGrQp35VPj8654e0H1oNCYRTvBnur/s1600/salida598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ITcaXdKjI0X03bqIzWMicrZinT3zxYwUvbIrinPEFmJCS1xYH_Ozy260jVpX7_JwbZrcPT-2W8n3mwL-ICCy0DhOXLqgBsbpZOybmMtGYoxmFEVXGrQp35VPj8654e0H1oNCYRTvBnur/s400/salida598.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen recortada y binarizada)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO9SIBDcqEeu-_r9kRBSUXdyom6BcKj1nNI4gMj4rAHabZm0uhGrNvewmRPRkbqVFMU4Paz6oY-ltnxR2VpCLye7IvH-5cYXL-EhnQdx6Sz7B3Uk8BXJEIElbp4Mn1OB56thsDqkWZwK0R/s1600/bw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO9SIBDcqEeu-_r9kRBSUXdyom6BcKj1nNI4gMj4rAHabZm0uhGrNvewmRPRkbqVFMU4Paz6oY-ltnxR2VpCLye7IvH-5cYXL-EhnQdx6Sz7B3Uk8BXJEIElbp4Mn1OB56thsDqkWZwK0R/s400/bw.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Salida del algoritmo de reconocimiento de caracteres)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9p2AQ44GDAJz1qXoEZ533IC8GeEDEiNuX1sCazJW4VMwm7P6c18_LULhnyIYl9EqnAxOtsoiP0qLlVqoZKG9xYdKe9G91MmIavWvIvVnOt0B4vFkjU_WPCHaHYGGqrBMgl3GHu803sB9Z/s1600/im14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9p2AQ44GDAJz1qXoEZ533IC8GeEDEiNuX1sCazJW4VMwm7P6c18_LULhnyIYl9EqnAxOtsoiP0qLlVqoZKG9xYdKe9G91MmIavWvIvVnOt0B4vFkjU_WPCHaHYGGqrBMgl3GHu803sB9Z/s400/im14.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba <span style="font-size: large;">2</span> - Tamaño de fuente 2<span style="font-size: large;">0</span>.</span></b></span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen capturada mediante la webcam) </span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyG3Ux59ZCsR7og7d9B0lgnl8KAxXNG_K0ay9HtGH-V6x10gfMl1p4ak_zisX_s-PKieWpnZp5Ok9AQe7CKKVB8ZRVm19qLwgsM4312TTem-AzBaie15_cOtgHQR8b5Wiys6qP3v8z4rmt/s1600/salida598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyG3Ux59ZCsR7og7d9B0lgnl8KAxXNG_K0ay9HtGH-V6x10gfMl1p4ak_zisX_s-PKieWpnZp5Ok9AQe7CKKVB8ZRVm19qLwgsM4312TTem-AzBaie15_cOtgHQR8b5Wiys6qP3v8z4rmt/s400/salida598.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen recortada y binarizada)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLDiSvIxAskJ-rfTwbijNi3J6r8LIEyeAwt053zkO9Td8EqOhSTJUZGdbeYEfgpC0oOgtSsgxm077A8RO51iAglG8ZwlxEd5VOgHrQcLLQaRckdgwbeZSgkFAtleOx7yv-MG1X_EqAg0MG/s1600/bw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLDiSvIxAskJ-rfTwbijNi3J6r8LIEyeAwt053zkO9Td8EqOhSTJUZGdbeYEfgpC0oOgtSsgxm077A8RO51iAglG8ZwlxEd5VOgHrQcLLQaRckdgwbeZSgkFAtleOx7yv-MG1X_EqAg0MG/s400/bw.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Salida del algoritmo de reconocimiento de caracteres)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXPBiVzMvkox2y9-zt83qo01islidfbaaloHAF-68T4FflogeociAANVO0OCqhiJN0powAe-2ltUdT6tLj46hKGOyHzwtWt_YVbnJb7tJmWA4fxTGZzAHAD1W_Bx5sCUbJutmKuvhA9HQo/s1600/im11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXPBiVzMvkox2y9-zt83qo01islidfbaaloHAF-68T4FflogeociAANVO0OCqhiJN0powAe-2ltUdT6tLj46hKGOyHzwtWt_YVbnJb7tJmWA4fxTGZzAHAD1W_Bx5sCUbJutmKuvhA9HQo/s400/im11.png" width="400" /></a></div>
<br />
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba <span style="font-size: large;">3</span> - Tamaño de fuente <span style="font-size: large;">15</span>.</span></b></span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen capturada mediante la webcam) </span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYhoqkykD1TNbPBMm_YcwhLEZiiO5gInOk_oAbgm4tnvMJHBP_kAseZjJDm06K7s6MlMZ9c5jiTPlkkhyphenhyphenriPcI53tOFEY5_GblxPlYH3sSGXGDgWLzN_aARADhksLUQGtW7EwjHNjsLN1L/s1600/salida598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYhoqkykD1TNbPBMm_YcwhLEZiiO5gInOk_oAbgm4tnvMJHBP_kAseZjJDm06K7s6MlMZ9c5jiTPlkkhyphenhyphenriPcI53tOFEY5_GblxPlYH3sSGXGDgWLzN_aARADhksLUQGtW7EwjHNjsLN1L/s400/salida598.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen recortada y binarizada)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJXNXBSD6y3FhdMzApPl7EYXw-fBOFjZWCN_fAUK4J1bWudnHEl2wtl6YnoIfsCf_D2BPlzJojX7F4pWyGvIyvQsn6LBdHcXE75NVXxzmRJGLNTcZ8D8KTeKsu_AU-2itm-6Xd88Terg0j/s1600/bw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJXNXBSD6y3FhdMzApPl7EYXw-fBOFjZWCN_fAUK4J1bWudnHEl2wtl6YnoIfsCf_D2BPlzJojX7F4pWyGvIyvQsn6LBdHcXE75NVXxzmRJGLNTcZ8D8KTeKsu_AU-2itm-6Xd88Terg0j/s400/bw.png" width="400" /></a></div>
<div style="text-align: center;">
<br />
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Salida del algoritmo de reconocimiento de caracteres)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYVgxwYOmllqB4I62rI7kxDZMBWk0mGoMYnCvdP3EpzCtFRa02vRCQ97IDAMgkO9zloPVqGeniop4HPyL13uTKS89Ni7Sug1Sl_vMX_gvFWMjxCuTwYj5MDV_FQnkGm4c15d6JCtcxkPRu/s1600/im12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYVgxwYOmllqB4I62rI7kxDZMBWk0mGoMYnCvdP3EpzCtFRa02vRCQ97IDAMgkO9zloPVqGeniop4HPyL13uTKS89Ni7Sug1Sl_vMX_gvFWMjxCuTwYj5MDV_FQnkGm4c15d6JCtcxkPRu/s400/im12.png" width="400" /></a></div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<br /></div>
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba <span style="font-size: large;">4</span> - Tamaño de fuente <span style="font-size: large;">1<span style="font-size: large;">0</span></span>.</span></b></span><br />
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;"> </span></b></span><br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen capturada mediante la webcam) </span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0orxwYISN8ZoVOiEh66a1f62Gx0Scy86ubcLS0DhZqiPh3_a8474c0djx_-EmnSBK8Vod1ZA7QOTum3fh9ekFFm4oykVtb2OsMRkulPX77hYJ1rQoddGyn1SAVp6UGDY2YM934DbxP2-I/s1600/salida598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0orxwYISN8ZoVOiEh66a1f62Gx0Scy86ubcLS0DhZqiPh3_a8474c0djx_-EmnSBK8Vod1ZA7QOTum3fh9ekFFm4oykVtb2OsMRkulPX77hYJ1rQoddGyn1SAVp6UGDY2YM934DbxP2-I/s400/salida598.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Imagen recortada y binarizada, </span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">son pocas palabras porque tuve que acercar demasiado el documento a la cámatra web, de otra manera, el algoritmo no reconocía nada</span>)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDqt8oo9eRSp05jmHDQxMaiyVR-QKBMZjvlRdJvl3-A4OD6F3FnbFQEKFxRisOOt2zw6mAMovQfrK-hcVPRPsnsq5KRLiDF9EJPN9P5Ni-tZcMOWEexAi_aZ9ASxsJs0ESIhmQ_5s9HVUt/s1600/bw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="61" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDqt8oo9eRSp05jmHDQxMaiyVR-QKBMZjvlRdJvl3-A4OD6F3FnbFQEKFxRisOOt2zw6mAMovQfrK-hcVPRPsnsq5KRLiDF9EJPN9P5Ni-tZcMOWEexAi_aZ9ASxsJs0ESIhmQ_5s9HVUt/s320/bw.png" width="320" /></a></div>
<div style="text-align: center;">
<br />
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">(Salida del algoritmo de reconocimiento de caracteres)</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWs19WX9-NU2BI-PFo1ZqYVGikRdVZTmDud0tObA7k9xuytqzzJIAGMFZ7Ic1WQliXHW8l9ltvjm4W49Mc46z7sacx1oxbKK2x7DPTlgtB2TcoPoPgzhFVUv2WOpdE8DyOcbXU4s51btm/s1600/im13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWs19WX9-NU2BI-PFo1ZqYVGikRdVZTmDud0tObA7k9xuytqzzJIAGMFZ7Ic1WQliXHW8l9ltvjm4W49Mc46z7sacx1oxbKK2x7DPTlgtB2TcoPoPgzhFVUv2WOpdE8DyOcbXU4s51btm/s400/im13.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="color: #666666; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Evaluación de desempeñ<span style="font-size: x-large;">o</span> </span></span></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para realizar la evaluación del desempeño realicé una gráfica con los errores y aciertos cometidos durante la detección de los caracteres, para hacer las pruebas tomé 4 documentos con contenido distinto y también con tamaño de fuente distinto. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Usé los tamaños de fuente 10, 15, 20 y 25, todos a fuente Arial.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv-vUkyXsRmlCbzFEbKMbOPWPy5qFx_VAck5xyErIm9G8BhxqbXjkI9U7vxDc6JqGge0oUmofw10Xu-Ix8cnswOpq51O3RP-KRdPpbhcK5BEsmN_OfaaDNZfFV41ao39HuwEpD7CgRgkqD/s1600/im30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv-vUkyXsRmlCbzFEbKMbOPWPy5qFx_VAck5xyErIm9G8BhxqbXjkI9U7vxDc6JqGge0oUmofw10Xu-Ix8cnswOpq51O3RP-KRdPpbhcK5BEsmN_OfaaDNZfFV41ao39HuwEpD7CgRgkqD/s200/im30.png" width="200" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimXrQB8hTnYb-PRyj_EkbfB5JDGqZRdggYre54IpAewc2nSFpOcACQ0S7JU_rCXc_CtfAZzstBYWltMd-IaJS0vcnrVtz4q58nmvwWTSEDE4FQZxSK4E_BD1ybU03e82r63MZTfwZ8J730/s1600/im20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimXrQB8hTnYb-PRyj_EkbfB5JDGqZRdggYre54IpAewc2nSFpOcACQ0S7JU_rCXc_CtfAZzstBYWltMd-IaJS0vcnrVtz4q58nmvwWTSEDE4FQZxSK4E_BD1ybU03e82r63MZTfwZ8J730/s640/im20.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">El algoritmo de reconocimiento de caracteres "tesseract" tuvo un mayor número de aciertos con el documento de fuente tamaño 20, pero esto no quiere decir que el tamaño de fuente sea el ideal o el que mayores aciertos tiene sobre todos, sino que debemos recordar que cada documento tenía distinto número de palabras y distinto contenido. En todo caso el documento con el que se ovtuvo mayor acierto fue el de tamaño de fuente 25, naturalmente. También esto explica la cantidad de errores con el tamaño de fuente 10, ya que el número de palabras a reconocer solo fue de 17, porque eran tan pequeñas las letras que tuve que acercar demasiado el documento a la cámara.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">A partir del número de fuente 15, los errores eran tantos que el texto parecía escrito en alemán :). </span></div>
<div style="text-align: justify;">
<div style="text-align: center;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: large;"><br /><span style="font-size: x-large;">Trabajo a futuro (mejoras e ideas<span style="font-size: x-large;">)</span> </span></span></span></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">El trabajo a realizar a futuro es desarrollar nuevos filtros para presentar una mejor entrada al motor de reconocimiento de caracteres "tesseract - OCR". Entre los filtros que pienso desarrollar son un limpiador de imágenes, que quite todo el ruido que impide el corrector reconocimiento. </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fMtPhikmA3V_iCkEysqj3ofymA-Hz5UEe0K0kJqFUhfkFC_V2M5nPxOrjtScdwE6ip9zqIR8TM_6czibZT_iQkqGpKZ1PnJ4NszeCm5bF0I0aDOx6sXZBULv-LV4KkT39Q4o2RSMohJz/s1600/im1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fMtPhikmA3V_iCkEysqj3ofymA-Hz5UEe0K0kJqFUhfkFC_V2M5nPxOrjtScdwE6ip9zqIR8TM_6czibZT_iQkqGpKZ1PnJ4NszeCm5bF0I0aDOx6sXZBULv-LV4KkT39Q4o2RSMohJz/s320/im1.png" width="320" /></a></div>
<br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Además de una filtro que corrija el ángulo de documento, ya que por medio de la cámara web, es bastante propensa la mala colocación del documento, impidiento el correcto reconocimiento. </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIC-IaKF7AD_AW0h8JeDEa3F-5SCDcWMCzXQ50Ip3NVITJz-bY4l9XfDhSoJpTB0JXOID9cjZIcAOrduGWbIAmuesdTPx00qbYCNBOeop6Q_WPvpU_Wr6klL5Aq1cIS3M8YwHxDBsUWL8M/s1600/right.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIC-IaKF7AD_AW0h8JeDEa3F-5SCDcWMCzXQ50Ip3NVITJz-bY4l9XfDhSoJpTB0JXOID9cjZIcAOrduGWbIAmuesdTPx00qbYCNBOeop6Q_WPvpU_Wr6klL5Aq1cIS3M8YwHxDBsUWL8M/s320/right.png" width="320" /></a></div>
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br />A continuación les dejo con la presentación que expuse en clase: </span></div>
<div style="text-align: justify;">
<br /></div>
<center>
<iframe allowfullscreen="true" frameborder="0" height="500" mozallowfullscreen="true" src="https://docs.google.com/presentation/d/1mWiTGGJxw0L4TdWQL1EFo1jYZuNL7vItaoSqQ5Be4-Y/embed?start=false&loop=false&delayms=3000" webkitallowfullscreen="true" width="710"></iframe>
</center>
<br />
<br />
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;"><b>CÓDIGO</b></span><br /> </span><br />
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <i><b>Control de versiones (liga al repositorio):</b></i> <a href="https://github.com/eddypre/TrianaProject">https://github.com/eddypre/TrianaVisionProject</a></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br />- <i><b>Comentarios</b></i>: Las funciones más relevantes de mi código están comentarizadas para su fácil entendimiento.<br /> </span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <b><i>README & INSTALL</i>: </b>Agregué en el repositorio 2 archivos de texto un README y un INSTALL que muestran los pasos para correr el programa y también para instalar las librerías necesarias, respectivamente. </span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">-<i> <b>Ejemplos (datos)</b></i>: En el repositorio se encuentran los archivos de texto con las salidas de cada imagen tomada por la cámara web, se trata de 4 imágenes con distinto contenido y con distinto tamaño de letra (tamaño 5, 10, 15 y 20. Todos con fuente Arial).</span></div>
<div style="text-align: left;">
</div>
</div>
<div style="text-align: justify;">
<br />
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;">BIBLIOGRAFÍA</span></b></span><br />
<span style="font-size: large;"><b><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></b></span></div>
<div style="text-align: justify;">
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <i>Creación, carga y lecturas de archivo de texto</i>, [Web en línea]. <<a href="http://pythonya.appspot.com/detalleconcepto?deta=Creaci%C3%B3n,%20carga%20y%20lectura%20de%20archivos%20de%20texto">http://pythonya.appspot.com/detalleconcepto?deta=Creaci%C3%B3n,%20carga%20y%20lectura%20de%20archivos%20de%20texto</a>>. [Consulta: 25-03-13]</span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <i>Converting image with Python + OpenCV</i>, [Web en línea]. <<a href="http://extr3metech.wordpress.com/2012/09/23/convert-photo-to-grayscale-with-python-opencv/">http://extr3metech.wordpress.com/2012/09/23/convert-photo-to-grayscale-with-python-opencv/</a>>. [Consulta: 25-03-13]</span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <i>Converting an OpenCV Image to black and white</i>, [Web en línea]. <<a href="http://stackoverflow.com/questions/7624765/converting-an-opencv-image-to-black-and-white">http://stackoverflow.com/questions/7624765/converting-an-opencv-image-to-black-and-white</a>>. [Consulta: 25-03-13]</span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;">- <i>Ubuntu 12.04, the installation PyTesser in OCR recognition</i>, [Web en línea]. <<a href="http://www.rapidsnail.com/Tutorial/t/2012/1031/11/21498/ubuntu-1204-the-installation-pytesser-in-ocr-recognition.aspx">http://www.rapidsnail.com/Tutorial/t/2012/1031/11/21498/ubuntu-1204-the-installation-pytesser-in-ocr-recognition.aspx</a>>. [Consulta: 25-03-13]</span></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /><br />Eso es todo por mi parte.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en la caja de comentarios. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos! </span><br />
<br /></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com2tag:blogger.com,1999:blog-1310697525469401982.post-77011696636718062812013-05-09T09:02:00.001-07:002013-05-09T09:16:13.310-07:00Laboratorio 9<div style="text-align: center;">
<span style="color: #666666;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 9 - Detección de esquinas</span></span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola a toda la gente que visita este blog, esta entrada corresponde a la actividad número 9 del laboratorio de Visión Computacional. La actividad consiste en la detección de esquinas de polígonos, para posteriormente pintar cada uno de ellos.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bien los pasos que seguí para realizar esta actividad son los siguientes:</span></div>
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Escala de grises (ya lo habíamos realizado)</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Obtener el filtro medio (desde la escala de grises)</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Realizar una diferencia para obtener los puntos esquina (diferencia entre escala de grises y filtro medio)</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Realizar filtros para limpiar la imagen (simples umbrales)</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Unir los puntos esquina obtenidos </span><span style="font-family: Arial,Helvetica,sans-serif;"><br /><br /><b> (Imagen original)</b></span></li>
</ul>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi964HyZoA2wMuEoshMJO3fH0PzRjaH4wraUJ2XCZGN1UKpbIjCPyZ56ZAAms5FVR6P93pnVYoAkzQjtQhPAdd9Tvzi78qP1wImAEZ6SE3-MKkQrAEJ5F9GZZFxE3wurVC30vXONjm8TJkj/s1600/im1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi964HyZoA2wMuEoshMJO3fH0PzRjaH4wraUJ2XCZGN1UKpbIjCPyZ56ZAAms5FVR6P93pnVYoAkzQjtQhPAdd9Tvzi78qP1wImAEZ6SE3-MKkQrAEJ5F9GZZFxE3wurVC30vXONjm8TJkj/s320/im1.png" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;">Como ya mencioné antes el proceso para escala de grises ya lo teníamos, por lo tanto no entraré a detalle en eso.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para obtener el filtro medio, simplemente guardé en una lista los valores de los pixeles de los vecinos, luego los ordené de menor a mayor y saqué el de enmedio, cada pixel del filtro medio lo asigné a una nueva imagen.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El código que realiza esto es el siguiente:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<script src="https://gist.github.com/eddypre/5548157.js"></script>
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"></span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /> </span><br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;"> (Filtro medio)</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZD714QrCC1v7ZJQPSVaRWF4QQ_q3TR1lWCuAY5IzvmvYNSmhTXh6fmbIDJAKy5BroXin5aDkQ2yEdajrvoFku2TWdqkhbdQS5WvB9rTIdi2BdlHorkaGRLPEjzUrJ10CaqkPmM-71q-_/s1600/im2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZD714QrCC1v7ZJQPSVaRWF4QQ_q3TR1lWCuAY5IzvmvYNSmhTXh6fmbIDJAKy5BroXin5aDkQ2yEdajrvoFku2TWdqkhbdQS5WvB9rTIdi2BdlHorkaGRLPEjzUrJ10CaqkPmM-71q-_/s320/im2.png" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;">Después para obtener la diferencia simplemente resté los valores de cada pixel de la escala de grises a la de filtro medio, el código que realiza este proceso es el siguiente (Aquí también agregué el código para trazar las lineas de punto a punto, para destacar el polígono ):</span><br />
<script src="https://gist.github.com/eddypre/5548174.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;"> (Diferencia + filtro con umbrales)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6vjXapE0dWSg8UBClGFxWdNfo5fvg-P3fcJv9_uGNE-dSY_kKwnG_QfnUsPqxX7JkVDPHjimfcbpyazGl9bb1rQU0FpjaZIqenl9RfSeOkGCk5pJLBhvX3vbo4ZczH0pYoyQrVTrCrEb/s1600/im3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6vjXapE0dWSg8UBClGFxWdNfo5fvg-P3fcJv9_uGNE-dSY_kKwnG_QfnUsPqxX7JkVDPHjimfcbpyazGl9bb1rQU0FpjaZIqenl9RfSeOkGCk5pJLBhvX3vbo4ZczH0pYoyQrVTrCrEb/s320/im3.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>(Trazado de líneas para unir puntos)</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi71GvlU0m3jtKmN7Il82MkkNFqueofLWO4CdAcEWmi19jkTGVIdw9RNhyphenhyphenqIN-uDJ_Cg3av3Y5kcm8jqqfWSiD0bPx31eHYeUfJvYt_UmWaVpiwMFZAEP3krzvziaaWFKI1PnOpZr-9-H60/s1600/im4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi71GvlU0m3jtKmN7Il82MkkNFqueofLWO4CdAcEWmi19jkTGVIdw9RNhyphenhyphenqIN-uDJ_Cg3av3Y5kcm8jqqfWSiD0bPx31eHYeUfJvYt_UmWaVpiwMFZAEP3krzvziaaWFKI1PnOpZr-9-H60/s320/im4.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-family: Arial,Helvetica,sans-serif;">Una de las impresiones que muestro en pantalla con las coordenadas de las esquinas encontradas:</span><br />
<br /></div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTPHNg5scv5e_0DPfepeDyD5b7_sTq7y1fZByQmEfA29ohIkYCa9jiXdQDVvh59CFKh6vtcbp6Rqtrxfsd47Z-iF_w77hnX2gBeg2L0LVNDpYjoinwfm5Z-izjK7DSW2JWlRGyBSZdjiJa/s1600/im20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTPHNg5scv5e_0DPfepeDyD5b7_sTq7y1fZByQmEfA29ohIkYCa9jiXdQDVvh59CFKh6vtcbp6Rqtrxfsd47Z-iF_w77hnX2gBeg2L0LVNDpYjoinwfm5Z-izjK7DSW2JWlRGyBSZdjiJa/s640/im20.png" width="640" /></a></div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Eso es todo por mi parte.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a mi git: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en la caja de comentarios. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos!</span></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com2tag:blogger.com,1999:blog-1310697525469401982.post-70732943493409722142013-05-02T09:42:00.000-07:002013-05-02T09:49:59.967-07:00Laboratorio 8<div style="text-align: center;">
<span style="color: #444444;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 8 - Detección de polígonos</span></span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola compañeros y gente que regularmente visita mi blog, esta entrada corresponde a la actividad número 8 de laboratorio de Visión Computacional. La actividad consiste en la detección de poligonos. Los pasos para llevar acabo la actividad son los siguientes:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Lo primero que realicé fue pasar la imagen a escala de grises. Realizado ese proceso, apliqué convolución para obtener los bordes de las figuras, después corrí bfs para obtener los pixeles de los diferentes polígonos de la imagen.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Teniendo las coordenandas de los pixeles de los posibles polígonos, me posicioné sobre un pixel para ver si los pixeles vecinos contaban con los mismos valores de pendiente; con esto nos damos cuenta si la colección de pixeles verificados correspondian a un mismo segmento, por ejemplo en un tríangulo contariamos con 3 segmentos, cada segmento (colección de pixeles) lo fui guardando.</span><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"> (Original)</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3wxpmXgE9hfUhyphenhyphenxsoRlPZDSwulWLwqBzwwVvUFuFBdRJLSSBUo8ZJtqRZQfOKL13yZHaYkICdiACNjcx2Xe8I29UAmUbN3nT6IZpD1wlfNJDH7GHUo5JVQTfqDXiEDA-K4-bz19bzHR_/s1600/c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3wxpmXgE9hfUhyphenhyphenxsoRlPZDSwulWLwqBzwwVvUFuFBdRJLSSBUo8ZJtqRZQfOKL13yZHaYkICdiACNjcx2Xe8I29UAmUbN3nT6IZpD1wlfNJDH7GHUo5JVQTfqDXiEDA-K4-bz19bzHR_/s320/c.png" width="320" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Código que realiza los procesos anteriores:</span></div>
<div style="text-align: justify;">
<br /></div>
<script src="https://gist.github.com/eddypre/5501280.js"></script>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheRuDjPShCWr_cY7Bl30TsbSh1rWthMJ19My_YAfwfVeA9PGYyXbvAXpCpltari8Uo1w_Cqen-HZ-n8hzpqRdIrgS0t4f67a3epNTDqkLL6q-CAzKvaiWBjO7_bSj9SmGpGzMSEkSAoDWb/s1600/out.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheRuDjPShCWr_cY7Bl30TsbSh1rWthMJ19My_YAfwfVeA9PGYyXbvAXpCpltari8Uo1w_Cqen-HZ-n8hzpqRdIrgS0t4f67a3epNTDqkLL6q-CAzKvaiWBjO7_bSj9SmGpGzMSEkSAoDWb/s320/out.png" width="320" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Luego de obtenidos los segmentos, obtuve el punto medio de cada uno de ellos, además de los puntos iniciales y finales </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7wjEL_pDxOkm8oqqu_XT4M06QrilvCLML89KKP6gCup77gTVCVR7VPXamfT8q6mXbAaKZrk5FIhqNWqnGNqoxVi_u6Hu5QgzcFO7VaGV6sf0Ya9OnGBReoPk_rOYQVshBAFJLtTqtqj4l/s1600/eq1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="42" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7wjEL_pDxOkm8oqqu_XT4M06QrilvCLML89KKP6gCup77gTVCVR7VPXamfT8q6mXbAaKZrk5FIhqNWqnGNqoxVi_u6Hu5QgzcFO7VaGV6sf0Ya9OnGBReoPk_rOYQVshBAFJLtTqtqj4l/s200/eq1.png" width="200" /></a></div>
<br />
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El código para realizar esto es el siguiente:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<script src="https://gist.github.com/eddypre/5501347.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Luego obtuve el punto medio y con el punto medio de los segmentos trasladé cada uno de ellos hacia el centro, ahí se intersectan cada uno de ellos. Además obtuve el porcentaje del polígono.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El código que realiza este proceso es el siguiente:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<script src="https://gist.github.com/eddypre/5501384.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El resultado es el siguiente:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQDNX1-iXJi00XF1iqjblkJ9yPde9e56mJFb7cgIjgDKpFm52JQrszziWj5MibOzwRg5gxQ0RXL1-4wkaIu1RVppOodHkFG0uukofz6QGKSiYggujWmOQMXwXww8_y9DP7zWT3NcD9LVEa/s1600/im1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQDNX1-iXJi00XF1iqjblkJ9yPde9e56mJFb7cgIjgDKpFm52JQrszziWj5MibOzwRg5gxQ0RXL1-4wkaIu1RVppOodHkFG0uukofz6QGKSiYggujWmOQMXwXww8_y9DP7zWT3NcD9LVEa/s200/im1.png" width="196" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Resultado con un tríangulo:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjppAOkuXxeA-jNPvU68uI9NGIxgs68hV_VQkVzli41r8zlDc1Svf3Z5Z9fIJTg9JXQzbaD4caqo5XCYIBTiHhbEhEUl69XK1M6u0ALQeW78I8f4JOW6ct7tbe77mgJ3LXY2r4qMY_m93s_/s1600/im1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjppAOkuXxeA-jNPvU68uI9NGIxgs68hV_VQkVzli41r8zlDc1Svf3Z5Z9fIJTg9JXQzbaD4caqo5XCYIBTiHhbEhEUl69XK1M6u0ALQeW78I8f4JOW6ct7tbe77mgJ3LXY2r4qMY_m93s_/s200/im1.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5400PURYzXGtZcylv1vWSArnKi9QOd1e2z6eAATmyZy27aL2cD_pbZYqYzcc5MJ_iNgyEQ12hwl4TXhyphenhyphenWC8mTQuoKEK8RGhw48jbEvYQm7Q2kICaB58my3iAi5mAO1jqeNFZPjWUl4qN-/s1600/im2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5400PURYzXGtZcylv1vWSArnKi9QOd1e2z6eAATmyZy27aL2cD_pbZYqYzcc5MJ_iNgyEQ12hwl4TXhyphenhyphenWC8mTQuoKEK8RGhw48jbEvYQm7Q2kICaB58my3iAi5mAO1jqeNFZPjWUl4qN-/s1600/im2.png" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq1yoXDi1emKz0rZVj1BWnMt9vsFSqDkWZx_wSARQSsgYzBEX6nYG5BVewHdbLhVjclurUkRw_zBIFBVkLtv7HGY_T-W7jg9BZbaVVgHO0FVqeRj4VMQ5YFxBjUYn_hDwB44a38h1TIpEQ/s1600/im3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq1yoXDi1emKz0rZVj1BWnMt9vsFSqDkWZx_wSARQSsgYzBEX6nYG5BVewHdbLhVjclurUkRw_zBIFBVkLtv7HGY_T-W7jg9BZbaVVgHO0FVqeRj4VMQ5YFxBjUYn_hDwB44a38h1TIpEQ/s200/im3.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoCHRkb4zQ-c2Gfuq6DKVr2EiaRlbTb_AkcGdihvJ0ee9z32lgmvetSU7N6XNlb1Rp-xl-VKMKEzWHOvfJH63CBsq9H1bBTzCf5gR1Fss-BoZ9wjYCynHJ6Pq7ghYowzgCMStEkOpgzV_/s1600/im4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoCHRkb4zQ-c2Gfuq6DKVr2EiaRlbTb_AkcGdihvJ0ee9z32lgmvetSU7N6XNlb1Rp-xl-VKMKEzWHOvfJH63CBsq9H1bBTzCf5gR1Fss-BoZ9wjYCynHJ6Pq7ghYowzgCMStEkOpgzV_/s200/im4.png" width="190" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8w31RO8Ya5OexuKsRMh-yYidUcQioN2QztjEPdOtV1KJcsWW7oZXm1OPOtMIAjscm1sesse9cnXAQKOwpXIJLyNduvpGnHJAWLYgXgYvZhmdwQZlHCmVLsnt2wHkMZX1sBwdTz-vsUYHe/s1600/im5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8w31RO8Ya5OexuKsRMh-yYidUcQioN2QztjEPdOtV1KJcsWW7oZXm1OPOtMIAjscm1sesse9cnXAQKOwpXIJLyNduvpGnHJAWLYgXgYvZhmdwQZlHCmVLsnt2wHkMZX1sBwdTz-vsUYHe/s200/im5.png" width="200" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Es todo por esta actividad. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a mi repositorio: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos!</span></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-43300262476175530032013-04-25T06:55:00.005-07:002013-04-25T08:15:01.318-07:00Laboratorio 7<div style="text-align: center;">
<span style="color: #666666;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Laboratorio 7</span> - Detección de agujeros (preprocesamiento)</span></span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola,
esta entrada corresponde a la actividad número 7 del laboratorio de Visión
Computacional, consiste en la detección de agujeros por medio de
histogramas.</span></div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP1z4ByB2mQsdEzCpk-674GvHeNNh5dwc6bMPTy8RPeeW_BIoJMlRrLxpy9c9y7e5fZU5hcjlNdcfYRs2LdUrMyfbilsjDGTesldfiJLSAmhdDXIIMTiukLF8vvCaJvTf6MaXDRrOGMhz/s1600/in1.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP1z4ByB2mQsdEzCpk-674GvHeNNh5dwc6bMPTy8RPeeW_BIoJMlRrLxpy9c9y7e5fZU5hcjlNdcfYRs2LdUrMyfbilsjDGTesldfiJLSAmhdDXIIMTiukLF8vvCaJvTf6MaXDRrOGMhz/s320/in1.JPG" width="320" /></a></div>
</div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bien,
para la detección de agujeros usé la técnica de histograma lateral, lo
primero que realicé fue obtener los histogramas lateral vertical y
horizontal, esto lo realicé sumando cada uno de los pixeles por fila y
al final se obtenía un total en cada fila; también realicé lo mismo con
las columnas, esto se hace con el propósito de obtener las intensidades
de pixeles y así por medio de picos (superior o inferior) de
intensidades de pixeles se obtienen los posibles agujeros.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación muestro el proceso detallado para realizar lo antes mencionado.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Bien
lo primero que tengo es la imagen original (tomada con mi cámara), a
esta le pasó por el proceso de escala de grises que habíamos
desarrollado en tareas pasadas. </span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>(Imagen original) </b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-A7ksPl0fhMhss1GWT_zmulSSwmydfAgoetSSIe1ukXu0NsJsdBqMy-HuY8q-q844YzPWAAomHPELDKoJ-_lm_85RMlmB2-Kn2P_UCNgT4H2raNfo7gd0-sQNGWQ_KREh_BsaPFenQaaK/s1600/in1.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-A7ksPl0fhMhss1GWT_zmulSSwmydfAgoetSSIe1ukXu0NsJsdBqMy-HuY8q-q844YzPWAAomHPELDKoJ-_lm_85RMlmB2-Kn2P_UCNgT4H2raNfo7gd0-sQNGWQ_KREh_BsaPFenQaaK/s320/in1.JPG" width="320" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>(Imagen escala de grises) </b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEtgXRZvONJfBmeq36NIFwnzka2GQm5x1U2ZrfMEuwTZgcHAOi3FljB3u9-NeDkaJm1fYz4QVgI3MlhJPtmplNjZm0JYFvqhqEZ3esXDOACYH3X3ie6CvvwYS28Zw4Sijh45gMF6b2nwIc/s1600/temp1.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEtgXRZvONJfBmeq36NIFwnzka2GQm5x1U2ZrfMEuwTZgcHAOi3FljB3u9-NeDkaJm1fYz4QVgI3MlhJPtmplNjZm0JYFvqhqEZ3esXDOACYH3X3ie6CvvwYS28Zw4Sijh45gMF6b2nwIc/s320/temp1.JPG" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Teniendo
la imagen en esacala de grises, sabemos que cada pixel tiene el mismo
valor en sus 3 componentes (RGB), de esta manera sumamos cualquiera de
ellos a su pixel consecutivo, y así hasta terminar la fila o columna. Si
continuamos con el proceso podemos concluir que tendremos 2 listas del
tamaño de las dimensiones de la imagen, y cada elemento de la lista será
el total de la suma de intensidades de pixeles para una respectiva fila
o columna. El código que hace todo este proceso es el siguiente:</span><br />
<br />
<script src="https://gist.github.com/eddypre/5441002.js"></script>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Como pueden observar en el
código también fui rellenando archivos dat (uno para histograma lateral
vertical y otro para horizontal), en los que contiene el resultado de
las sumas de cada fila y columna, junto con su correspondiente número de
fila/columna, esto con el objetivo de graficar en gnuplot cada uno de
los histogramas.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Este
es el resultado del archivo "horizontal.dat" usado para graficar el
histograma en gnuplot, el valor de la columna 1 son las filas de la
imagen (solo puse hasta el 25, pero son mucho más, obviamente depende de
las dimensiones de tu imagen); la columna 2 son las sumas de la
intensidad de los pixeles.</span><br />
<pre><code>
0 141835
1 141895
2 141890
3 141757
4 141698
5 141803
6 141817
7 141685
8 141859
9 142024
10 141962
11 141760
12 141657
13 141662
14 141812
15 142030
16 141920
17 141918
18 141951
19 142003
20 142015
21 141910
22 141774
23 141748
24 142089
25 142136
</code></pre>
<span style="font-family: Arial,Helvetica,sans-serif;">Este es el
resultado del archivo "vertical.dat" el valor de la columna 1
corresponde a las columnas de la imagen, mientras que el de la columna 2
corresponde a las sumas de las intensidades de la respectiva columna
(obviamente tampoco puse todas, solo las primeras 25).</span><br />
<pre><code>
0 134999
1 134896
2 134912
3 135076
4 135153
5 135076
6 135008
7 135046
8 134931
9 134854
10 135049
11 135276
12 135119
13 134867
14 134904
15 135087
16 134957
17 135071
18 134839
19 134753
20 134903
21 135025
22 135075
23 134918
24 135052
</code></pre>
<span style="font-family: Arial,Helvetica,sans-serif;">Los resultados ploteados en gnuplot se ven de la siguiente manera:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /> </span><br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral horizontal)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxtFqpRNBI8rUGaEz__TtM35qx4F_hj0rxmBYztE6zIQGbqCEJiYtLSeStldjR-1uI-OhPgD5efbrmcqJtd1pKFhmjTmfoyhuN1B-EwrOMNHcWe8p3ac8k6MaRFJequOx3pmd3WMyOrgR3/s1600/horizontal.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxtFqpRNBI8rUGaEz__TtM35qx4F_hj0rxmBYztE6zIQGbqCEJiYtLSeStldjR-1uI-OhPgD5efbrmcqJtd1pKFhmjTmfoyhuN1B-EwrOMNHcWe8p3ac8k6MaRFJequOx3pmd3WMyOrgR3/s640/horizontal.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral vertical)</span></b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwFRr4wO7JJvopTg9ZrAoepSVgrAlgo5FDO27CSiSwEnpo2_RsQs3ld1u2P6AKsfvQtpxNmZPq2Y8a-sx_rzgZPvtWrwaVBiKhzJJal_yPyb6j1qCZR1_LyQkQ990mdNhrVw8DmEntRgq/s1600/vertical.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwFRr4wO7JJvopTg9ZrAoepSVgrAlgo5FDO27CSiSwEnpo2_RsQs3ld1u2P6AKsfvQtpxNmZPq2Y8a-sx_rzgZPvtWrwaVBiKhzJJal_yPyb6j1qCZR1_LyQkQ990mdNhrVw8DmEntRgq/s640/vertical.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Después calculé umbrales para
poder tomar solo los picos resultantes, los umbrales los obtuve
promediando la listas donde contenía todas las sumas de las filas y las
columnas, es decir, tengo 2 umbrales; luego filtré los puntos obtenidos
para pintar una linea por cada supuesto agujero (pico). El código que
realiza este proceso es el siguiente:</span><br />
<br />
<br />
<script src="https://gist.github.com/eddypre/5441079.js"></script>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">El resultado es el siguiente:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9rSrf32XNjWkG3aG8Gids6XN-gy4VobtjIcLl6af71NnpR6JTkdYi21KdwSQxuoyRSUWHae1PbivQ9Q-Wy4e2GFEvzQYWBCt3jDSrMOn1_Pc9aY9_YuEILDqRX9VfSnAK1RUB6vo9WhW/s1600/out.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9rSrf32XNjWkG3aG8Gids6XN-gy4VobtjIcLl6af71NnpR6JTkdYi21KdwSQxuoyRSUWHae1PbivQ9Q-Wy4e2GFEvzQYWBCt3jDSrMOn1_Pc9aY9_YuEILDqRX9VfSnAK1RUB6vo9WhW/s320/out.JPG" width="320" /></a></div>
<br />
<span style="font-family: Arial, Helvetica, sans-serif;">Ahora, no siempre tendrán picos inferiores, como los que observan en las imágenes anteriores de gnuplot; esto se dio porque los orificios mostraban una auscencia de luz, por lo tanto era más obscuro que el fondo (imagen blanca). En cambio si en los agujeros hay más luz que en el fondo (osea la hoja) es obvio que los picos de las gráficas de gnuplot serán superiores, es decir, estarán apuntando hacia arriba.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtzEKSXRp3DpLBcTaVYuF34MZ_7okrplqKqWO6sL_S4EWr2d07UL8Wg26WNmoEzbQy8R6W7nPmFfFJpwkNnL-7nGc1GohdP44BJ-a4w047GfQPcqX2jrQXvTJnHluF_xDekMqmZ28iHJu/s1600/intro1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtzEKSXRp3DpLBcTaVYuF34MZ_7okrplqKqWO6sL_S4EWr2d07UL8Wg26WNmoEzbQy8R6W7nPmFfFJpwkNnL-7nGc1GohdP44BJ-a4w047GfQPcqX2jrQXvTJnHluF_xDekMqmZ28iHJu/s320/intro1.jpg" width="320" /></a></div>
<br />
<span style="font-family: Arial, Helvetica, sans-serif;">Para comprobar esto yo invertí los colores de la imagen anterior con la ayuda de Kolour paint y realicé la prueba, así se ven los nuevos picos en gnuplot:</span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif;"><b>(Lateral horizontal) </b></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsKVZVX6k0LLopnuvFDl0yNvmUOrFpTXNoradPKyhzXkqZr90kSLMPFv3vTSYs9EW_GoeNkymYnNOJgCG5GlKNwXOYrEAWCd_j_FoocLabu_1rpfvMFoNNLMrhcuRlH4090C2mfPPw4dQ/s1600/im1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsKVZVX6k0LLopnuvFDl0yNvmUOrFpTXNoradPKyhzXkqZr90kSLMPFv3vTSYs9EW_GoeNkymYnNOJgCG5GlKNwXOYrEAWCd_j_FoocLabu_1rpfvMFoNNLMrhcuRlH4090C2mfPPw4dQ/s640/im1.png" width="640" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif;"> </span> </div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral vertical)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNe8Ea6QWGTAN_losQNKyrixjRFRaIEHAEBBDQDeeEn4XgSjat_eWidfqkkfHDN5IEeT6MyZwPZqzqLxu1202GEtoenjZSX5VAhkeuRZIGpNxifa-DKRufDk6buUyrcJ-De-cm7AB1NkG0/s1600/vertical.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="443" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNe8Ea6QWGTAN_losQNKyrixjRFRaIEHAEBBDQDeeEn4XgSjat_eWidfqkkfHDN5IEeT6MyZwPZqzqLxu1202GEtoenjZSX5VAhkeuRZIGpNxifa-DKRufDk6buUyrcJ-De-cm7AB1NkG0/s640/vertical.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
<hr />
<b><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;">Prueba 2</span></span></span></b><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Esta vez ya no explico el proceso porque es prácticamente lo mismo.</span><br />
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Imagen original)</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtR9EDjvaTxW377vcXBT6Ys09xU4OQccvhgQsZBYq7y3TC9HlSZEpOVkbXK4EyQgI5eALfSX468Dae0c7KeUyL_miXn_oX0XPW9Ou7dFdlDwz0HQP8aOyH-zr2yYlBrUfo8G3M0BNR4bq/s1600/in2.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtR9EDjvaTxW377vcXBT6Ys09xU4OQccvhgQsZBYq7y3TC9HlSZEpOVkbXK4EyQgI5eALfSX468Dae0c7KeUyL_miXn_oX0XPW9Ou7dFdlDwz0HQP8aOyH-zr2yYlBrUfo8G3M0BNR4bq/s320/in2.JPG" width="320" /></a></div>
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral horizontal)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZNUCna2Xefabr4fDilxymE5DonFAT9cwcafpaxNdreKICLCJ4DG0uSxaMhWr0EiLhm-th8JfZ2K32WtxbciWPYh7R6eW2IjZlsQtxtvCUrqfHyh7faTXSppnyW9MpQHXmMKpDfhe5IPo1/s1600/horizontal.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZNUCna2Xefabr4fDilxymE5DonFAT9cwcafpaxNdreKICLCJ4DG0uSxaMhWr0EiLhm-th8JfZ2K32WtxbciWPYh7R6eW2IjZlsQtxtvCUrqfHyh7faTXSppnyW9MpQHXmMKpDfhe5IPo1/s640/horizontal.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral vertical)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1Ng5t6BJHjRbYZCq_hW9p7fxAqxa5oVuvWNPXDkIfpxsMqIlkMX-soa5Bry7XllLoBb2U_tH0Kl_7eitHhvDhGemus3tfshf_Z9cbnt4vjdDWRi0n6hyCwzw9zSPaCs6NgDpEBz7c00U/s1600/vertical.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1Ng5t6BJHjRbYZCq_hW9p7fxAqxa5oVuvWNPXDkIfpxsMqIlkMX-soa5Bry7XllLoBb2U_tH0Kl_7eitHhvDhGemus3tfshf_Z9cbnt4vjdDWRi0n6hyCwzw9zSPaCs6NgDpEBz7c00U/s640/vertical.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Trazado de líneas en posibles agujeros)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACQwnWpes6GKrz71p8y_CCyLQpjGtR6ujoB5bHWsk_kRnOho6wxhHtXpYyqb1Zn6f_yBKDjRMRVNBFBCVsVdDGbhz0pxdK1EywwagbsnE8IFFuIeVfQe47KbY9BHpTwD8pAXD0Jek1tTY/s1600/out.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACQwnWpes6GKrz71p8y_CCyLQpjGtR6ujoB5bHWsk_kRnOho6wxhHtXpYyqb1Zn6f_yBKDjRMRVNBFBCVsVdDGbhz0pxdK1EywwagbsnE8IFFuIeVfQe47KbY9BHpTwD8pAXD0Jek1tTY/s320/out.JPG" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Una
de las tantas impresiones que hice en terminal fueron los puntos donde
se intersectan las líneas con los picos o posibles agujeros.</span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2KF3nYKZMU6XmGPI1EWsmHWLioMSbMyhKOMxDUnfMhTE6e4fEHf5sbC27wRZxxxKS0SV6u-7Lsn81KRiFByxc990vBlxdOt5IldloN9K-VgtRYZfm7BRLWYzGYNy-hNkIVkd8GTAVRwc/s1600/centros.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2KF3nYKZMU6XmGPI1EWsmHWLioMSbMyhKOMxDUnfMhTE6e4fEHf5sbC27wRZxxxKS0SV6u-7Lsn81KRiFByxc990vBlxdOt5IldloN9K-VgtRYZfm7BRLWYzGYNy-hNkIVkd8GTAVRwc/s1600/centros.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Eso es todo por esta actividad. </span>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a mi repositorio: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Referencias: <a href="http://elisa.dyndns-web.com/%7Eelisa/teaching/comp/vision/agujeros.pdf">http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf </a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos!</span></div>
<div style="text-align: justify;">
<br /></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-16674091282566890492013-04-22T22:05:00.000-07:002013-04-22T23:33:42.457-07:00Tarea 6<div style="text-align: center;">
<span style="color: #666666;"><b><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Tarea 6 - Detección de agujeros</span></span></b></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta entrada corresponde a la tarea número 6 de la materia de Visión Computacional, consiste en la detección de agujeros por medio de histogramas.</span></div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP1z4ByB2mQsdEzCpk-674GvHeNNh5dwc6bMPTy8RPeeW_BIoJMlRrLxpy9c9y7e5fZU5hcjlNdcfYRs2LdUrMyfbilsjDGTesldfiJLSAmhdDXIIMTiukLF8vvCaJvTf6MaXDRrOGMhz/s1600/in1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP1z4ByB2mQsdEzCpk-674GvHeNNh5dwc6bMPTy8RPeeW_BIoJMlRrLxpy9c9y7e5fZU5hcjlNdcfYRs2LdUrMyfbilsjDGTesldfiJLSAmhdDXIIMTiukLF8vvCaJvTf6MaXDRrOGMhz/s320/in1.JPG" width="320" /></a></div>
</div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bien, para la detección de agujeros usé la técnica de histograma lateral, lo primero que realicé fue obtener los histogramas lateral vertical y horizontal, esto lo realicé sumando cada uno de los pixeles por fila y al final se obtenía un total en cada fila; también realicé lo mismo con las columnas, esto se hace con el propósito de obtener las intensidades de pixeles y así por medio de picos (superior o inferior) de intensidades de pixeles se obtienen los posibles agujeros.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación muestro el proceso no tan detallado (eso se verá en el laboratorio).</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bien lo primero que tengo es la imagen original (tomada con mi cámara), a esta le pasó por el proceso de escala de grises que habíamos desarrollado en tareas pasadas. </span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>(Imagen original) </b></span></div>
<div style="text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-A7ksPl0fhMhss1GWT_zmulSSwmydfAgoetSSIe1ukXu0NsJsdBqMy-HuY8q-q844YzPWAAomHPELDKoJ-_lm_85RMlmB2-Kn2P_UCNgT4H2raNfo7gd0-sQNGWQ_KREh_BsaPFenQaaK/s1600/in1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-A7ksPl0fhMhss1GWT_zmulSSwmydfAgoetSSIe1ukXu0NsJsdBqMy-HuY8q-q844YzPWAAomHPELDKoJ-_lm_85RMlmB2-Kn2P_UCNgT4H2raNfo7gd0-sQNGWQ_KREh_BsaPFenQaaK/s320/in1.JPG" width="320" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>(Imagen escala de grises) </b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEtgXRZvONJfBmeq36NIFwnzka2GQm5x1U2ZrfMEuwTZgcHAOi3FljB3u9-NeDkaJm1fYz4QVgI3MlhJPtmplNjZm0JYFvqhqEZ3esXDOACYH3X3ie6CvvwYS28Zw4Sijh45gMF6b2nwIc/s1600/temp1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEtgXRZvONJfBmeq36NIFwnzka2GQm5x1U2ZrfMEuwTZgcHAOi3FljB3u9-NeDkaJm1fYz4QVgI3MlhJPtmplNjZm0JYFvqhqEZ3esXDOACYH3X3ie6CvvwYS28Zw4Sijh45gMF6b2nwIc/s320/temp1.JPG" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Teniendo la imagen en esacala de grises, sabemos que cada pixel tiene el mismo valor en sus 3 componentes (RGB), de esta manera sumamos cualquiera de ellos a su pixel consecutivo, y así hasta terminar la fila o columna. Si continuamos con el proceso podemos concluir que tendremos 2 listas del tamaño de las dimensiones de la imagen, y cada elemento de la lista será el total de la suma de intensidades de pixeles para una respectiva fila o columna. El código que hace todo este proceso es el siguiente:</span><br />
<br />
<script src="https://gist.github.com/eddypre/5441002.js"></script>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Como pueden observar en el código también fui rellenando archivos dat (uno para histograma lateral vertical y otro para horizontal), en los que contiene el resultado de las sumas de cada fila y columna, junto con su correspondiente número de fila/columna, esto con el objetivo de graficar en gnuplot cada uno de los histogramas.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Este es el resultado del archivo "horizontal.dat" usado para graficar el histograma en gnuplot, el valor de la columna 1 son las filas de la imagen (solo puse hasta el 25, pero son mucho más, obviamente depende de las dimensiones de tu imagen); la columna 2 son las sumas de la intensidad de los pixeles.</span><br />
<pre><code>
0 141835
1 141895
2 141890
3 141757
4 141698
5 141803
6 141817
7 141685
8 141859
9 142024
10 141962
11 141760
12 141657
13 141662
14 141812
15 142030
16 141920
17 141918
18 141951
19 142003
20 142015
21 141910
22 141774
23 141748
24 142089
25 142136
</code></pre>
<span style="font-family: Arial,Helvetica,sans-serif;">Este es el resultado del archivo "vertical.dat" el valor de la columna 1 corresponde a las columnas de la imagen, mientras que el de la columna 2 corresponde a las sumas de las intensidades de la respectiva columna (obviamente tampoco puse todas, solo las primeras 25).</span><br />
<pre><code>
0 134999
1 134896
2 134912
3 135076
4 135153
5 135076
6 135008
7 135046
8 134931
9 134854
10 135049
11 135276
12 135119
13 134867
14 134904
15 135087
16 134957
17 135071
18 134839
19 134753
20 134903
21 135025
22 135075
23 134918
24 135052
</code></pre>
<span style="font-family: Arial,Helvetica,sans-serif;">Los resultados ploteados en gnuplot se ven de la siguiente manera:<br /> </span><br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral horizontal)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxtFqpRNBI8rUGaEz__TtM35qx4F_hj0rxmBYztE6zIQGbqCEJiYtLSeStldjR-1uI-OhPgD5efbrmcqJtd1pKFhmjTmfoyhuN1B-EwrOMNHcWe8p3ac8k6MaRFJequOx3pmd3WMyOrgR3/s1600/horizontal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="441" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxtFqpRNBI8rUGaEz__TtM35qx4F_hj0rxmBYztE6zIQGbqCEJiYtLSeStldjR-1uI-OhPgD5efbrmcqJtd1pKFhmjTmfoyhuN1B-EwrOMNHcWe8p3ac8k6MaRFJequOx3pmd3WMyOrgR3/s640/horizontal.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral vertical)</span></b></div>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwFRr4wO7JJvopTg9ZrAoepSVgrAlgo5FDO27CSiSwEnpo2_RsQs3ld1u2P6AKsfvQtpxNmZPq2Y8a-sx_rzgZPvtWrwaVBiKhzJJal_yPyb6j1qCZR1_LyQkQ990mdNhrVw8DmEntRgq/s1600/vertical.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwFRr4wO7JJvopTg9ZrAoepSVgrAlgo5FDO27CSiSwEnpo2_RsQs3ld1u2P6AKsfvQtpxNmZPq2Y8a-sx_rzgZPvtWrwaVBiKhzJJal_yPyb6j1qCZR1_LyQkQ990mdNhrVw8DmEntRgq/s640/vertical.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Después calculé umbrales para poder tomar solo los picos resultantes, los umbrales los obtuve promediando la listas donde contenía todas las sumas de las filas y las columnas, es decir, tengo 2 umbrales; luego filtré los puntos obtenidos para pintar una linea por cada supuesto agujero (pico). El código que realiza este proceso es el siguiente:</span><br />
<br />
<br />
<script src="https://gist.github.com/eddypre/5441079.js"></script>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">El resultado es el siguiente:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9rSrf32XNjWkG3aG8Gids6XN-gy4VobtjIcLl6af71NnpR6JTkdYi21KdwSQxuoyRSUWHae1PbivQ9Q-Wy4e2GFEvzQYWBCt3jDSrMOn1_Pc9aY9_YuEILDqRX9VfSnAK1RUB6vo9WhW/s1600/out.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv9rSrf32XNjWkG3aG8Gids6XN-gy4VobtjIcLl6af71NnpR6JTkdYi21KdwSQxuoyRSUWHae1PbivQ9Q-Wy4e2GFEvzQYWBCt3jDSrMOn1_Pc9aY9_YuEILDqRX9VfSnAK1RUB6vo9WhW/s320/out.JPG" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A partir de aquí, sabiendo los puntos en donde se intersectan los picos obtenidos, rellené los posibles agujeros con bfs (de distintas tonalidades de morado), además agregué un punto en amarillo sobre las intersecciones y una etiqueta a cada agujero. También calculé los porcentajes que ocupa cada agujero con respecto a las diemnsiones de toda la imagen. El código que hace este proceso es el siguiente: </span><br />
<br />
<script src="https://gist.github.com/eddypre/5441109.js"></script>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">El resultado del proceso es el siguiente:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPIbWYdNuMLUvQn-Qb7HY4CKIH_F_UKULmKTVpj45ouWuA2IGw61ZXyUPfMI2p3MgEEEN5xuTVa05Sc40xTunCUwnpeVJpsPlFF-6_0Vw7KWfHkgGhmRyPOcNm-RbZZf6m-a8xdcHfPqA/s1600/temp4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPIbWYdNuMLUvQn-Qb7HY4CKIH_F_UKULmKTVpj45ouWuA2IGw61ZXyUPfMI2p3MgEEEN5xuTVa05Sc40xTunCUwnpeVJpsPlFF-6_0Vw7KWfHkgGhmRyPOcNm-RbZZf6m-a8xdcHfPqA/s400/temp4.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRG96rothJgGZE_PSa1iGOZ6By1oP6MaMI5waQ75Zi9pCdGrRSq9PBkDKLH-01ldFY_Xsk74oMQzmk5rUGeu5-pJ6-GodOrtPm0-8H-vH2CgplqQ13VXFs6zwo9uoVI2pbT1gqslHKTDbF/s1600/porcentaje.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRG96rothJgGZE_PSa1iGOZ6By1oP6MaMI5waQ75Zi9pCdGrRSq9PBkDKLH-01ldFY_Xsk74oMQzmk5rUGeu5-pJ6-GodOrtPm0-8H-vH2CgplqQ13VXFs6zwo9uoVI2pbT1gqslHKTDbF/s400/porcentaje.png" width="400" /></a></div>
<br />
<hr />
<b><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;">Prueba 2</span></span></span></b><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Esta vez ya no explico el proceso porque es prácticamente lo mismo.</span><br />
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Imagen original)</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtR9EDjvaTxW377vcXBT6Ys09xU4OQccvhgQsZBYq7y3TC9HlSZEpOVkbXK4EyQgI5eALfSX468Dae0c7KeUyL_miXn_oX0XPW9Ou7dFdlDwz0HQP8aOyH-zr2yYlBrUfo8G3M0BNR4bq/s1600/in2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtR9EDjvaTxW377vcXBT6Ys09xU4OQccvhgQsZBYq7y3TC9HlSZEpOVkbXK4EyQgI5eALfSX468Dae0c7KeUyL_miXn_oX0XPW9Ou7dFdlDwz0HQP8aOyH-zr2yYlBrUfo8G3M0BNR4bq/s320/in2.JPG" width="320" /></a></div>
<br />
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral horizontal)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZNUCna2Xefabr4fDilxymE5DonFAT9cwcafpaxNdreKICLCJ4DG0uSxaMhWr0EiLhm-th8JfZ2K32WtxbciWPYh7R6eW2IjZlsQtxtvCUrqfHyh7faTXSppnyW9MpQHXmMKpDfhe5IPo1/s1600/horizontal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZNUCna2Xefabr4fDilxymE5DonFAT9cwcafpaxNdreKICLCJ4DG0uSxaMhWr0EiLhm-th8JfZ2K32WtxbciWPYh7R6eW2IjZlsQtxtvCUrqfHyh7faTXSppnyW9MpQHXmMKpDfhe5IPo1/s640/horizontal.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Lateral vertical)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1Ng5t6BJHjRbYZCq_hW9p7fxAqxa5oVuvWNPXDkIfpxsMqIlkMX-soa5Bry7XllLoBb2U_tH0Kl_7eitHhvDhGemus3tfshf_Z9cbnt4vjdDWRi0n6hyCwzw9zSPaCs6NgDpEBz7c00U/s1600/vertical.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1Ng5t6BJHjRbYZCq_hW9p7fxAqxa5oVuvWNPXDkIfpxsMqIlkMX-soa5Bry7XllLoBb2U_tH0Kl_7eitHhvDhGemus3tfshf_Z9cbnt4vjdDWRi0n6hyCwzw9zSPaCs6NgDpEBz7c00U/s640/vertical.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Trazado de líneas en posibles agujeros)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACQwnWpes6GKrz71p8y_CCyLQpjGtR6ujoB5bHWsk_kRnOho6wxhHtXpYyqb1Zn6f_yBKDjRMRVNBFBCVsVdDGbhz0pxdK1EywwagbsnE8IFFuIeVfQe47KbY9BHpTwD8pAXD0Jek1tTY/s1600/out.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACQwnWpes6GKrz71p8y_CCyLQpjGtR6ujoB5bHWsk_kRnOho6wxhHtXpYyqb1Zn6f_yBKDjRMRVNBFBCVsVdDGbhz0pxdK1EywwagbsnE8IFFuIeVfQe47KbY9BHpTwD8pAXD0Jek1tTY/s320/out.JPG" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Resultado final)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Las tonalidades de morado salieron parecidas, pero sí puse en el código que se obtuvieran valores aleatorios de RGB (con resultados morados) para cada agujero.</span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYnQqxmKAVk3AohnLCWYqJ041IztTS-Ib5ckNxYD6Bhq_1pzIq0ocAYo1HepeQTicRknOFuo_uNV7lRkg2cg9MOywe30OUJt8gaoSgtfG4AR2DTgX2zHApPNiDHaA6ojM9paOdc0kjyjEA/s1600/temp4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYnQqxmKAVk3AohnLCWYqJ041IztTS-Ib5ckNxYD6Bhq_1pzIq0ocAYo1HepeQTicRknOFuo_uNV7lRkg2cg9MOywe30OUJt8gaoSgtfG4AR2DTgX2zHApPNiDHaA6ojM9paOdc0kjyjEA/s400/temp4.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXTj7MtkvfQIaiG46M7RqKcdP1BbBtA5X6L3NnO_dQa7zgnVOFKJ9HyTJL0jNgFKyvZ8fhcB9UOeq0_19ITjdoP55GAERjrmGJ2i9gx8b5P4gZtbYG9ZKPUPRfmte3EaQU71VMlc20aTpu/s1600/porcentajes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXTj7MtkvfQIaiG46M7RqKcdP1BbBtA5X6L3NnO_dQa7zgnVOFKJ9HyTJL0jNgFKyvZ8fhcB9UOeq0_19ITjdoP55GAERjrmGJ2i9gx8b5P4gZtbYG9ZKPUPRfmte3EaQU71VMlc20aTpu/s400/porcentajes.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Una de las tantas impresiones que hice en terminal fueron los puntos donde se intersectan las líneas con los picos o posibles agujeros.</span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2KF3nYKZMU6XmGPI1EWsmHWLioMSbMyhKOMxDUnfMhTE6e4fEHf5sbC27wRZxxxKS0SV6u-7Lsn81KRiFByxc990vBlxdOt5IldloN9K-VgtRYZfm7BRLWYzGYNy-hNkIVkd8GTAVRwc/s1600/centros.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2KF3nYKZMU6XmGPI1EWsmHWLioMSbMyhKOMxDUnfMhTE6e4fEHf5sbC27wRZxxxKS0SV6u-7Lsn81KRiFByxc990vBlxdOt5IldloN9K-VgtRYZfm7BRLWYzGYNy-hNkIVkd8GTAVRwc/s1600/centros.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Eso es todo por esta actividad. </span>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a mi repositorio: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Referencias: <a href="http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf">http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf </a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<span style="font-family: Arial,Helvetica,sans-serif;"></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos!</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com2tag:blogger.com,1999:blog-1310697525469401982.post-49714864323830901632013-04-18T01:01:00.000-07:002013-04-18T08:37:26.769-07:00Laboratorio 6<div style="text-align: center;">
<span style="color: #666666;"><b><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 6 - Relleno de elipses / círculos</span></span></b></span><br />
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta entrada corresponde a la actividad número 6 del laboratorio de Visión Computacional. La actividad consiste en el relleno de elipses y círculos.</span></div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para realizar esta actividad generé elipses con centros y radios (menores y mayores) con valores aleatorios, luego de generar los elipses obtuve las coordenadas de el borde de cada elipse generado, desde 0° hasta 360° mediante las siguiente ecuaciones:</span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"> <b> <i><span style="color: #444444;"> <span style="color: #0b5394;">puntox = centrox + (radiox*cos(angulo))<br /> puntoy = centroy + (radioy*sin(angulo)) </span></span></i></b></span></div>
</div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Luego esas coordenadas las uso para recalcar el borde del elipse y usar bfs para rellenar cada uno de los elipses. Seguido de eso pongo puntos en los centros de cada elipse, además de su ID (también en el centro). Al final calculo los porcentajes que ocupa cada elipse con respecto a las dimensiones de la imagen completa.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bien, al iniciar el programa, tú decides el número de elipses a poner, luego genero los centros y radios aleatoriamente (como lo mencioné anteriormente) de la siguiente manera:</span><br />
<br />
<script src="https://gist.github.com/eddypre/5412984.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><br />Después mi programa pasa a dibujar cada uno de los elipses con los valores retornados por la función orígenes, esto lo hace mi función dibujar:</span></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<br />
<div style="text-align: justify;">
<script src="https://gist.github.com/eddypre/5412987.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Además de dibujar los elipses también remarca el contorno de los mismos usando las coordenadas obtenidas del borde (por medio de las ecuaciones antes mencionadas). La función dibujar también rellena mis elipses mandando llamar a bfs, esta misma función marca los centros en color azul y pone las etiquetas con el ID.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<script src="https://gist.github.com/eddypre/5413042.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Al final calculo los porcentajes de cada elipse con respecto a las dimensiones de la imagen completa:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<script src="https://gist.github.com/eddypre/5413071.js"></script>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Ahora les muestro los resultados obtenidos.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<hr />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="color: #666666;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba 1.</span></b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">No se aprecia muy bien el centro de cada elipse, pero si lo marqué con un pixel en azul (se puede corroborar en el código).</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNz2wOSaR8LTAZPQPHvC74XWA_jOt7qZc-1lOQi2xld1Chb2MDVysZXNUVXiV1hux5BDxcUz1DiWlAH8Uk-_TL7RtMNNRYnK7JtVG8hnqGdINvjcb7xhCcxRQTb1ZKWEriCvFpvW8dwqo/s1600/p1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNz2wOSaR8LTAZPQPHvC74XWA_jOt7qZc-1lOQi2xld1Chb2MDVysZXNUVXiV1hux5BDxcUz1DiWlAH8Uk-_TL7RtMNNRYnK7JtVG8hnqGdINvjcb7xhCcxRQTb1ZKWEriCvFpvW8dwqo/s640/p1.png" width="640" /></a></div>
<br />
<hr />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="color: #666666;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Prueba 2.</span></b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Pueden notar (en terminal) que paso como parámetro el número de elipses a plasmar. Igual, no se nota el pixel azul central, pero si está presente.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xH50tBr5nJIyqC8SX4uCGNqTw693kM3ErGFmbcKgBMj6spYKWVjLNvolliCFCKoBh7pxKo_npJ9Q06282fUO-ufjPj5Jvexy9DxMZctOf_Zu_pI8bgXQI5pDqxOhXvoYgmk1dmqxh0Y_/s1600/p2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xH50tBr5nJIyqC8SX4uCGNqTw693kM3ErGFmbcKgBMj6spYKWVjLNvolliCFCKoBh7pxKo_npJ9Q06282fUO-ufjPj5Jvexy9DxMZctOf_Zu_pI8bgXQI5pDqxOhXvoYgmk1dmqxh0Y_/s640/p2.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<hr />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Prueba 3.</b></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLDa-cJlCPlQGugS15cJXe6aPmj6QaaKRZlkFFBLr6CMicy21q4TsQ0tvHBexpXP_wmrJAEqUsluneEsdgnLfqubt9zqp3orEncVk0bZOey7pOVCmII1HGlqNakXoRgLVzRG1dM-RwNEB/s1600/p3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLDa-cJlCPlQGugS15cJXe6aPmj6QaaKRZlkFFBLr6CMicy21q4TsQ0tvHBexpXP_wmrJAEqUsluneEsdgnLfqubt9zqp3orEncVk0bZOey7pOVCmII1HGlqNakXoRgLVzRG1dM-RwNEB/s640/p3.png" width="640" /></a></div>
<br />
<hr />
<br />
<span style="color: #666666;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Extra.</span></b></span><br />
<br />
<span style="color: #666666;"><span style="color: black;"><span style="font-family: Arial,Helvetica,sans-serif;">Bueno, para su deleite, les dejo un arte abstracto que generé pasando un parámetro de 60 elipses. </span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRSilN4cn-8p0frriX8Ktijf-YRUKxpr_QpvuS0U_MCy-ZZmvzLz6mE6IjUIe5s6KpIf8u1j0Bl1oDUHTGmESqVuPGskPNCUB9EjvtRNP-Qs4dNIFSVJXqJXn1Uw2gUDdD1g1kQcpyE6sv/s1600/out.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRSilN4cn-8p0frriX8Ktijf-YRUKxpr_QpvuS0U_MCy-ZZmvzLz6mE6IjUIe5s6KpIf8u1j0Bl1oDUHTGmESqVuPGskPNCUB9EjvtRNP-Qs4dNIFSVJXqJXn1Uw2gUDdD1g1kQcpyE6sv/s640/out.png" width="640" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Esto es todo por esta actividad.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a mi repositorio: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a> </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos! </span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
</div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-27359069642637514742013-04-08T23:07:00.004-07:002013-04-08T23:11:45.324-07:00Presentación de proyecto<div style="text-align: center;">
<b><span style="font-size: x-large;"><span style="font-family: Arial, Helvetica, sans-serif;">Presen<span style="font-size: x-large;">tación de proyecto</span></span></span></b></div>
<br />
<iframe allowfullscreen="true" frameborder="0" height="549" mozallowfullscreen="true" src="https://docs.google.com/presentation/d/1OE3PKcJCl7UJTtfaGFwjttJpNh5NFgyWJgTwmx_N_00/embed?start=false&loop=false&delayms=5000" webkitallowfullscreen="true" width="760"></iframe>
<br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos</span>!<br />
<br />
<br />Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com0tag:blogger.com,1999:blog-1310697525469401982.post-29223274311559233012013-03-07T09:56:00.000-08:002013-03-07T09:56:05.012-08:00Laboratorio 5<div style="text-align: center;">
<b><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 5 - Detección de círculos (radios distintos)</span></span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta entrada corresponde a la actividad de laboratorio 5 de la materia de Visión computacional y consiste en la detección de círculos (como la tarea 4), pero esta vez con radios distintos para cada círculo.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bueno, debido a que esta práctica es similar a la tarea 4 de la misma materia solo tuve que realizar unas pocas modificaciones al código que ya había realizado. La implementación consiste en obtener las coordenadas de los bordes para luego determinar los puntos más lejanos (entre cada círculo obviamente); mediante los puntos antes mencionados obtenemos el diámetro de cada círculo, sabiendo de antemano que la mitad de ese diámetro es el radio.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Al conocer el radio, luego repetimos los métodos usados en la práctica anterior para pintar las circunferencias y etiquetar con un ID a cada círculo:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El código que hace todo lo anteriormente explicado es el siguiente:</span></div>
<pre class="brush:py">
if __name__ =="__main__":
#transformar()
#filtrada()
#conv()
#umbrales()
#*********************************************************************
miImagen = Image.open("meh.jpeg")
dr = ImageDraw.Draw(miImagen)
p = miImagen.load()
x, y = miImagen.size
for i in range(x):
for j in range(y):
#print p[i, j]
#time.sleep(1)
if p[i,j] == (255,255,255):
#print "afserfsefr"
n, bordes = bfs(miImagen, (i,j), (255,0,0))
menor, mayor, radio = Diametro(bordes)
print "menor: ", menor[0], " + mayor: ", mayor[0]
inicio(miImagen, radio)
miImagen.show()
def Diametro(bordes):
menor = min(bordes)
mayor = max(bordes)
diametro = mayor[0] - menor[0]
radio = int(ceil(diametro / 2.0))
print radio
return menor, mayor, radio
def inicio(im, radio): #Ahora es variable
#im = Image.open("meh4.png")
mx = [[-1, -1, -1], [2, 2, 2], [-1, -1, -1]]
my = [[-1, 2, -1], [-1, 2, -1], [-1, 2, -1]]
imx = convolucion(im, mx)
imy = convolucion(im, my)
frecuencia = centros(imx, imy, im, radio)
maximo = 0
suma = 0.0
for i in frecuencia.keys():
suma += frecuencia[i]
if frecuencia[i] > maximo:
maximo = frecuencia[i]
promedio = suma/len(frecuencia)
umbral = maximo-promedio
for i in frecuencia.keys():
if frecuencia[i] < umbral:
frecuencia.pop(i)
circulos(im,frecuencia,radio)
</pre>
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El pintado de circunferencia así como la etiqueta de los círculos ya lo habíamos visto y lo pueden encontrar en la entrada anterior.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Esto fue lo "nuevo" para esta entrada, tuve bastantes problemas con bfs para obtener las coordenadas requeridas. </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Uno de los intentos fallidos:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia4a79a1zzI1BmTmj-c092z5RsNNtNbfo4WT4i13lCElCO792ikuRE-4jN4RTUJvewjt0D_5JtJlZQP0Z_F-JR1HEUODuhbgl4dU7W06MyqdrG05GsGKI2WxpUhOt27eY6xRPmGrSAvGkx/s1600/image10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia4a79a1zzI1BmTmj-c092z5RsNNtNbfo4WT4i13lCElCO792ikuRE-4jN4RTUJvewjt0D_5JtJlZQP0Z_F-JR1HEUODuhbgl4dU7W06MyqdrG05GsGKI2WxpUhOt27eY6xRPmGrSAvGkx/s640/image10.png" width="640" /></a></div>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">La idea es buena pero la actividad no la pude terminar por falta de tiempo. Intentaré corregirlo y completarlo lo más pronto posible.<br /> </span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos! </span></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-23137916289545009362013-03-05T02:57:00.001-08:002013-03-05T03:00:08.418-08:00Tarea 4<div style="text-align: center;">
<b><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Tarea 4 - Detección de círculos</span></span></b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta entrada corresponde a la tarea 4 de la clase de visión computacional. La tarea 4 consiste en encontrar círculos en una determinada imagen, lo primero que se hizo fue encontrar los centros de los círculos, luego pintar la circunferencia de cada uno de ellos con distintas tonalidades (de amarillo) y etiquetar los círculos. Todo esto con un radio preestablecido por nosotros.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para realizar esta práctica hice uso de la transformada de Hough para círculos, además de las siguiente ecuaciones (<a href="http://www.google.com.mx/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CD0QFjAC&url=http%3A%2F%2Fwww.vision.uji.es%2Fcourses%2FDoctorado%2FFVC%2FFVC-T6-Hough-4p.pdf&ei=lsU1UdeUOqbf2QWop4DQAg&usg=AFQjCNFafpyKcR8_TAwCwK-8CA0PNL4_wQ&bvm=bv.43148975,d.b2I&cad=rja"><span style="font-family: Arial,Helvetica,sans-serif;">Enlace sobre información referente):</span></a></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6vvoqkIdovHqNBJK2TFBFsL6Loo-y5AHhQ2qU0qqDOWn0Gg7NYMSWc3eQDH61FlKSUTFRRiM8oMnwsLKN9Aydi6FRneOOXbUvYaZCE7k2XTf7GqtfwNM6l6XGEkNsjdZGObtnpcBUSDpB/s1600/image01.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6vvoqkIdovHqNBJK2TFBFsL6Loo-y5AHhQ2qU0qqDOWn0Gg7NYMSWc3eQDH61FlKSUTFRRiM8oMnwsLKN9Aydi6FRneOOXbUvYaZCE7k2XTf7GqtfwNM6l6XGEkNsjdZGObtnpcBUSDpB/s1600/image01.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK_QMuzFCL6t6mdipONb3_q0tWvnKkA4jMr8uIg28c682ZlAPdI194GUL5sm9vKlc6enYjaz7vBNCZnAaSMFlAj5XuapArgbAE6zCURDz4Pzceelhw_Um5nvjG7psrBU4hPFr341UfN_IX/s1600/image02.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK_QMuzFCL6t6mdipONb3_q0tWvnKkA4jMr8uIg28c682ZlAPdI194GUL5sm9vKlc6enYjaz7vBNCZnAaSMFlAj5XuapArgbAE6zCURDz4Pzceelhw_Um5nvjG7psrBU4hPFr341UfN_IX/s1600/image02.gif" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">En donde a y b corresponden al centro del círculo, mientras que "x" y "y" corresponden a puntos de la circunferencia en cierto ángulo. R es el radio preestablecido (en mi caso yo puse 50).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Primeramente obtenemos los centros de los círculos, para hacer esto se calculan los posibles centros, luego se hace uso de las frecuencias, donde las coordenadas que cuentan con el mayor número de frecuencia serán el centro del círculo.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para identificar los centros despejamos a y b (centro del círculo) de las ecuaciones anteriores quedando las nuevas ecuaciones de la siguiente manera: </span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJ8lNS1xW340meBcx8OoRc66s0rhtO_NTvuWBdlxEC8sNJGl6mGQGeRb47ewNpwFyUdrAL7Kj4RrXIRS7N0zNaAgyCa3FICzAilZ6cBFp-5ps_hxhWYRQFEtPax__Lt8BeutKtyPPwWZf/s1600/image03.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJ8lNS1xW340meBcx8OoRc66s0rhtO_NTvuWBdlxEC8sNJGl6mGQGeRb47ewNpwFyUdrAL7Kj4RrXIRS7N0zNaAgyCa3FICzAilZ6cBFp-5ps_hxhWYRQFEtPax__Lt8BeutKtyPPwWZf/s1600/image03.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq-XqbxpCoYU-rHwjUZ5NW-iMCZ_IeGwnvyFvbVYOAiT6p6c85_rkuBkggugldEZSIJCktBrvSmd7__-HEqrlsUGVrRwAOLIq7bADOpVs731bjxDS8E-dHF0V4-evydLEsw1fU4RUrSvsC/s1600/image04.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq-XqbxpCoYU-rHwjUZ5NW-iMCZ_IeGwnvyFvbVYOAiT6p6c85_rkuBkggugldEZSIJCktBrvSmd7__-HEqrlsUGVrRwAOLIq7bADOpVs731bjxDS8E-dHF0V4-evydLEsw1fU4RUrSvsC/s1600/image04.gif" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para obtener los ángulos, se usan los gradientes(x, y) con los que hemos estado trabajando en posts anteriores, obteniéndolos por medio de máscaras de convolución.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Obtención de los ángulos:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4yOn-1e3FU9ogqyiq2XaAtFWJXlgDgFRgZCE8oAMBk8Wk8E9pd7GAd_BvBlgVSx6zTItWPBl1nVvaZqXbKIpgnTq6nOdlAbtm-TN4gAFE6RYeregLO0e82d1qVp1BvAj9YJhghmbOq_p3/s1600/image05.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4yOn-1e3FU9ogqyiq2XaAtFWJXlgDgFRgZCE8oAMBk8Wk8E9pd7GAd_BvBlgVSx6zTItWPBl1nVvaZqXbKIpgnTq6nOdlAbtm-TN4gAFE6RYeregLO0e82d1qVp1BvAj9YJhghmbOq_p3/s1600/image05.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh8biiFPaAuCzpGQNijykpw0xo65kBGGRLxUx7mOw-4eAoYt61908afRdRGcd1XIcIKKPd9osweDvRFRqeec9gBR7OteqoUdNHnROcUDmapKLSxW8BvlhA_73A8TJZVE88BA-Wivs5FKYC/s1600/image06.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh8biiFPaAuCzpGQNijykpw0xo65kBGGRLxUx7mOw-4eAoYt61908afRdRGcd1XIcIKKPd9osweDvRFRqeec9gBR7OteqoUdNHnROcUDmapKLSxW8BvlhA_73A8TJZVE88BA-Wivs5FKYC/s1600/image06.gif" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Los centros son etiquetados con un ID y cada circunferencia es pintada con una tonalidad de amarillo distinta (como lo exige la actividad).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Los siguientes códigos códigos realizan los procesos antes mencionados (basados en los códigos de clase):</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<pre class="brush:py">im = Image.open("circle.png")
mx = [[-1, -1, -1], [2, 2, 2], [-1, -1, -1]]
my = [[-1, 2, -1], [-1, 2, -1], [-1, 2, -1]]
imx = convolucion(im, mx)
imy = convolucion(im, my)
radio = 50 # Variando para distintos radios de circulo
frecuencia = centros(imx, imy, im, radio)
maximo = 0
suma = 0.0
for i in frecuencia.keys():
suma += frecuencia[i]
if frecuencia[i] > maximo:
maximo = frecuencia[i]
promedio = suma/len(frecuencia)
umbral = maximo-promedio
for i in frecuencia.keys():
if frecuencia[i] < umbral:
frecuencia.pop(i)
circulos(im,frecuencia,radio)
im.save('newone.png')
</pre>
<pre class="brush:py">#Localizacion de centros y pintado de la circunferencia
def centros(imx, imy, im, r):
ancho,alto = im.size
frec = dict()
circulos = dict()
cx = imx.load()
cy = imy.load()
for x in range(ancho):
for y in range(alto):
(rx,gx,bx) = cx[x,y]
(ry,gy,by) = cy[x,y]
gx = float(rx+gx+bx)/3
gy = float(ry+gy+by)/3
g = sqrt(pow(gx,2) + pow(gy,2))
if fabs(g) > 0:
theta = atan2(gy,gx)
centro = (int( x - r * cos(theta)), int( y - r * sin(theta)))
if not centro in frec:
frec[centro] = 1
else:
frec[centro] += 1
return frec
def circulos(im, frecuencia, r):
pixeles = im.load()
fuente = ImageFont.truetype('/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf',20)
imagen = ImageDraw.Draw(im)
cont = 1
color = dict()
aux = 1
for i in frecuencia.keys():
color[i] = (random.randint(250,255), random.randint(100,255), random.randint(0,50)) #Distintos tonos de amarillo, para cada cirunferencia
imagen.ellipse((i[0]-aux, i[1]-aux, i[0]+aux, i[1]+aux), fill=(0,255,0))
imagen.text((i[0]+aux+3, i[1]), ('ID: '+str(cont)), fill=(0,0,255), font=fuente)
cont +=1
for c in color.keys():
i ,j = c
for angulo in range(360): #Pintar
x = i + r*cos(angulo)
y = j + r*sin(angulo)
pixeles[x,y] = color[c]
return im
</pre>
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Resultados obtenidos:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV7JP5OeX73uPdKnqnWewkTlUxTjQnPfxbmOLGXefZbpC-v-YtzCqUcthDTyS8lqb1rMZSIgHb_mMXsqiY2mbX0KWpwXmpiuL3tYnY_lgZV7M0W1bKQWCAUIJl_TY3koABMAPkrwfa6Km-/s1600/newone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV7JP5OeX73uPdKnqnWewkTlUxTjQnPfxbmOLGXefZbpC-v-YtzCqUcthDTyS8lqb1rMZSIgHb_mMXsqiY2mbX0KWpwXmpiuL3tYnY_lgZV7M0W1bKQWCAUIJl_TY3koABMAPkrwfa6Km-/s400/newone.png" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;">En este excluyó al color aqua :(</span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTRfSaTsFcM1k-XQc69yQZCd4dwtP0o2JlYsRmh7COf8OJiMmS-ndtOY_1F360CZZMgAUUJEilbNuwqpx3WhMuScHc9LLk9M8rSLl-1s2HP3H6qQLGRBvvhDojIhFITCOgOe6yFjR6EJO1/s1600/newone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTRfSaTsFcM1k-XQc69yQZCd4dwtP0o2JlYsRmh7COf8OJiMmS-ndtOY_1F360CZZMgAUUJEilbNuwqpx3WhMuScHc9LLk9M8rSLl-1s2HP3H6qQLGRBvvhDojIhFITCOgOe6yFjR6EJO1/s320/newone.png" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i><b><span style="font-family: Arial,Helvetica,sans-serif;"><u>Fuentes de ayuda:</u></span></b></i><br />
<i><b><span style="font-family: Arial,Helvetica,sans-serif;"><u> </u><br /> </span></b></i></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/circulo.py">http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/circulo.py </a></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.google.com.mx/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CD0QFjAC&url=http%3A%2F%2Fwww.vision.uji.es%2Fcourses%2FDoctorado%2FFVC%2FFVC-T6-Hough-4p.pdf&ei=lsU1UdeUOqbf2QWop4DQAg&usg=AFQjCNFafpyKcR8_TAwCwK-8CA0PNL4_wQ&bvm=bv.43148975,d.b2I&cad=rja">Detección de círculos y elipses</a></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos! </span></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-64776050686057133562013-02-28T07:57:00.000-08:002013-02-28T07:57:19.787-08:00Laboratorio 4<div style="text-align: center;">
<span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 4 - Detección de diagonales</span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta entrada corresponde a la cuarta actividad del laboratorio de visión computacional. La actividad consiste en localizar y pintar las diagonales de los objetos de una imagen.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">En esta misma entrada primero hablaré sobre la detección de lineas horizontales y verticales (esto fue la tarea 4 de la misma materia) continuar con el seguimiento y explicar de donde viene la detección de lineas en diagonal.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;"><b>Detección de l<span style="font-size: large;">í</span>neas </b></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para la detección de lineas usamos la transformada de Hough, lo que realizamos fue hacer el cálculo de los gradientes vertical y horizontal de la imagen usando máscaras de convolución (como lo hicimos en la actividad de detección de bordes) seguido de obtener los gradiente antes mencionados, continuamos calculando los valores de theta de los pixeles de la imagen.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cuando tenemos los gradientes, calculamos el ángulo de cada pixel, yo usé una imagen binarizada sin filtro, porque cuando la pasaba por mi filtro tendía a poner demasiadas lineas verticales y horizontales.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bueno, obtuvimos los ángulo de los pixeles con la siguiente fórmula:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKsRpvNhO8aekn6buoQiAvffz2aLjHQygRi5IcLv29Nwkg8rCk7F2Jqw4TQpeYphAHdjT40Dm3_91MarkPGdSzZMQuVw5eBMF1ibGrCMRSlY9PyFHz3sbpYrNxP2pWTmqjPKhDqTa8XpB/s1600/image1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="25" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKsRpvNhO8aekn6buoQiAvffz2aLjHQygRi5IcLv29Nwkg8rCk7F2Jqw4TQpeYphAHdjT40Dm3_91MarkPGdSzZMQuVw5eBMF1ibGrCMRSlY9PyFHz3sbpYrNxP2pWTmqjPKhDqTa8XpB/s200/image1.gif" width="200" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Las variables de esta fórmula son arctan (arcotangente), gy (gradiente y), gx (gradiente x).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Después de calcular los ángulos, se calcula la variable rho usando al fórmula siguiente:</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEvIVFuisMcA340pmyZ_HD0wvTr-v2LW4vV8uMeyc6Ymt-TRLdFcCxoIGkxQrHTcpIf1oXDxfmFUoTPkvZQsUkECWmfm39Elq6B6d_CdHDxz2HUfI9_Kj9bL8DTMS4WFrayFfXysE0XckG/s1600/image2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="22" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEvIVFuisMcA340pmyZ_HD0wvTr-v2LW4vV8uMeyc6Ymt-TRLdFcCxoIGkxQrHTcpIf1oXDxfmFUoTPkvZQsUkECWmfm39Elq6B6d_CdHDxz2HUfI9_Kj9bL8DTMS4WFrayFfXysE0XckG/s200/image2.gif" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvMgNI_aRnV7TY12PeLAALp05QPskMOJtFt0BEZq4ruLVpW4k8-7DGxcDyg67E2ubiYtImTmrpYdRuaBAb3hJvtTzjFsdFN5rnZFcPYwVKzYTEkoxs5tq0R_Kc9hQq25zgihQu4OMGh0jm/s1600/image2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">El valor de rho es guardado en una lista con el valor del ángulo theta.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Seguido de esto obtuvimos las frecuencias de cada "theta, rho" usando un diccionario, esto con el fin de determinar qué pixeles son lineas, tomando en cuenta que cuando un par (theta, rho) tiene más repeticiones, quiere decir que hay más probabilidad de que el par sea una línea (mismo ángulo.)</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para terminar pintamos pixeles pertenecientes a las líneas (azules para horizontales, rojo para verticales y verde para las líneas diagonales)</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Para las líneas diagonales solo agregué una condición que cuando el ángulo no fuera ni 0 ni 90 ni 180 ni 270 lo tomara como una diagonal (y lo pinté de verde).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación los highlights del código:</span></div>
<div style="text-align: justify;">
<pre class="brush:py">'''
Convolucion y deteccion de lineas
'''
def convolucion(im,g):
w, h = im.size
pixeles = im.load()
imConvolucion = Image.new('RGB', (w,h))
pix = imConvolucion.load()
for x in range(w):
for y in range(h):
suma = 0
for i in range(x-1, x+2):
for j in range(y-1, y+2):
try:
suma += g[i - (x-1)][j - (y-1)] * pixeles[i,j][1]
except:
pass
pix[x,y] = (suma,suma,suma)
return imConvolucion
def frecuentes(histo, cantidad):
frec = list()
for valor in histo:
if valor is None:
continue
frecuencia = histo[valor]
acepta = False
if len(frec) <= cantidad:
acepta = True
if not acepta:
for (v, f) in frec:
if frecuencia > f:
acepta = True
break
if acepta:
frec.append((valor, frecuencia))
frec = sorted(frec, key = lambda tupla: tupla[1])
if len(frec) > cantidad:
frec.pop(0)
incluidos = list()
for (valor, frecuencia) in frec:
incluidos.append(valor)
return incluidos
def deteccionDeLineas():
umbral = 10
im = Image.open("meh3.jpg")
sobelx = [[-1, -1, -1], [2, 2, 2], [-1, -1, -1]]
sobely = [[-1, 2, -1], [-1, 2, -1], [-1, 2, -1]]
imx = convolucion(im, sobelx)
imy = convolucion(im, sobely)
gx = imx.load()
gy = imy.load()
w,h = im.size
comb = {}
pixeles = im.load()
resultado = list()
for x in range(w):
datos = list()
for y in range(h):
hor = gx[x,y][0]
ver = gy[x,y][0]
if fabs(hor) + fabs(ver) <= 0.0:#nada en ninguna direccion
theta = None
elif hor == 0 and ver == 255:
theta = 90
elif fabs(hor) > 0.0:
theta = atan(fabs(ver/hor))
if theta is not None:
rho = fabs( x * cos(theta) + y * sin(theta))
if x > 0 and x < w-1 and y > 0 and y < h-1:
if (rho, theta) in comb:
comb[ (rho, theta) ] += 1
else:
comb[ (rho, theta) ] = 1
datos.append( (rho, theta) )
else:
datos.append((None,None))
resultado.append(datos)
incluir = int(ceil (len(comb) * umbral))
frec = frecuentes(comb, incluir)
for x in range(w):
for y in range(h):
if x > 0 and x< w-1 and y > 0 and y < h-1:
rho, theta = resultado[x][y]
if (rho, theta) in frec:
if theta == 0:
pixeles[x,y] = (255,0,0)
elif theta == 90:
pixeles [x,y] = (0,0,255)
elif theta != 0 and theta != 90 and theta != 180 and theta != 270: #Para diagonales
pixeles [x, y] = (0,255,0) #Los pintamos verde
print "Soy un pixel diagonal"
im.save('meh5.jpg')
</pre>
</div>
<div style="text-align: justify;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Ahora algunos resultados con imágenes sencillas (hacer click sobre ellas para ampliarlas):</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimTkgg84PxLwhQVoK4Dz2G-3odLK2NQRiuHFIRadWlKRt8GB0vd8ZWk2S7EiJBNnOMwGUwAvsFWrRpzGpVucXXklgke17gIAF1TGZERYvCEJA8ubgI9GmJQb8FkkWzpIQ-KRQfaKfvWlrU/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimTkgg84PxLwhQVoK4Dz2G-3odLK2NQRiuHFIRadWlKRt8GB0vd8ZWk2S7EiJBNnOMwGUwAvsFWrRpzGpVucXXklgke17gIAF1TGZERYvCEJA8ubgI9GmJQb8FkkWzpIQ-KRQfaKfvWlrU/s320/meh5.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: justify;">
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixRaKiv2Sj60dOj20qfaKBUtNABWSqCLlMm6lfaTLUfYMNvoyAoUVkXwrWqoNyVNqrYziir8_rqYWPN_C7_5qMzEFzplcWZ7zG-uVWpODTw7BG_XaNCB4IPNcU4cGJ7kTPCODUWspALsQr/s1600/image02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixRaKiv2Sj60dOj20qfaKBUtNABWSqCLlMm6lfaTLUfYMNvoyAoUVkXwrWqoNyVNqrYziir8_rqYWPN_C7_5qMzEFzplcWZ7zG-uVWpODTw7BG_XaNCB4IPNcU4cGJ7kTPCODUWspALsQr/s320/image02.png" width="320" /></a></div>
<div style="text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpYxw-Xj5JAP5wB0zBIO1tI9FUPRnPzhUdCeGR3ZGK8vysu5ggxjUiB0rCJMnVuLRUlnaciSwZ6XN5dm-kKHtwlT8ml-oTUMqSJh4sH4muHuZQVvZ8CF9WiMIrVaGvuiyLLcoRPpWRefFu/s1600/image03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpYxw-Xj5JAP5wB0zBIO1tI9FUPRnPzhUdCeGR3ZGK8vysu5ggxjUiB0rCJMnVuLRUlnaciSwZ6XN5dm-kKHtwlT8ml-oTUMqSJh4sH4muHuZQVvZ8CF9WiMIrVaGvuiyLLcoRPpWRefFu/s320/image03.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">(Para diagonales)</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsAyusuXh8dnJvkBhZ9v7aVG2khAihQb6NFMBFHQJX4Q5gEtZ6yMi5y1cZUwr_FkjWZ0Hg-0gV_km2MxMfjXY1M8EYZ0zzH50vmD93n6DhYtKZfUzD6eeMWjo-YNDa9VjDgFI4zzo86Uw5/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsAyusuXh8dnJvkBhZ9v7aVG2khAihQb6NFMBFHQJX4Q5gEtZ6yMi5y1cZUwr_FkjWZ0Hg-0gV_km2MxMfjXY1M8EYZ0zzH50vmD93n6DhYtKZfUzD6eeMWjo-YNDa9VjDgFI4zzo86Uw5/s400/meh5.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<i><span style="font-family: Arial,Helvetica,sans-serif;">(Una sección se pinto verde porque traia letras XD) </span></i><b><span style="font-family: Arial,Helvetica,sans-serif;"></span></b></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsd2D-iECrNrCpp-hEBN3abLe8Id8aC0T42IlifgGwXt0BNdc2xA978zqvLWS2ORXc2BYTWdGgYtQoNDK-XS7Y6hgIoYYm38g9ew_N_Mw5OE8oXREqrSEUwDfd6S87-_SRHs__xPIkXg7G/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsd2D-iECrNrCpp-hEBN3abLe8Id8aC0T42IlifgGwXt0BNdc2xA978zqvLWS2ORXc2BYTWdGgYtQoNDK-XS7Y6hgIoYYm38g9ew_N_Mw5OE8oXREqrSEUwDfd6S87-_SRHs__xPIkXg7G/s320/meh5.jpg" width="310" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAef0J-uqW-zsiTU535WwqAYoXsabhl8Oqy8oMJV9OdR4qYup_sRLkdDF1Eefc3l-MIpcTGW5HbSeWwUxBAAb8rf-jzBVWwS76X5-FxKWp4zojoeeYIOb3KOkCvJkA22U-_tfatTdkmrGL/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAef0J-uqW-zsiTU535WwqAYoXsabhl8Oqy8oMJV9OdR4qYup_sRLkdDF1Eefc3l-MIpcTGW5HbSeWwUxBAAb8rf-jzBVWwS76X5-FxKWp4zojoeeYIOb3KOkCvJkA22U-_tfatTdkmrGL/s320/meh5.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Mi liga de git: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a> </span></span>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos!</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-35651242381537441862013-02-20T23:47:00.000-08:002013-02-20T23:47:49.183-08:00Laboratorio 3<div style="text-align: center;">
<span style="color: #666666;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Laboratorio 3 - Convex hull</span></span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, en esta actividad de laboratorio de Visión computacional realizaremos la actuvidad de convex hull, que no es más que una región convexa que abarca una figura entera (sobre convexa).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Esta actividad la realizaré a partir del resultado de las actividades anteriores, la base sobre la que se trabajará es una imagen binarizada con bordes identificados, donde los bordes están pintados en color blanco y el resto de la imagen en color negro.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Existen diversos métodos para obtener la cerradura convexa, pero el que usé yo (porque casi todos los compañeros usamos ese) es el de Jarvis, este algoritmo parte de un punto vértice, luego lo que hace es envolver todos los puntos contenidos. </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">En este sitio se explica muy bien el funcionamiento, además vienen animaciones muy buenas para entenderlo: <a href="http://www.cs.princeton.edu/courses/archive/spr09/cos226/demo/ah/JarvisMarch.html">http://www.cs.princeton.edu/courses/archive/spr09/cos226/demo/ah/JarvisMarch.html</a> </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Mi código:</span><br />
<br />
<br />
<script src="https://gist.github.com/eddypre/5001470.js"></script>
<br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Este es el resultado, marqué en rojo los puntos determinados por jarvis y las líneas verdes es el convex hult, pueden observar que hubo muchos errores ya que existen puntos donde no deberían, de esa manera al pintar las lineas tomaba muchos puntos de referencia, intentaré solucionarlo después.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXIX0rNF-mkibkhGOFwXtScp83BWs4xJoMZO_hhwgjcF2N85lZLuIAf2OKkyZ_Xp2DwVMYkbcvoLHazfuwb2zuIbc9oQkXetK2H0ys2toRQK-HkDQeDUnMFcv8FPxBUmprKHuiKR3aghzm/s1600/Jarvis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXIX0rNF-mkibkhGOFwXtScp83BWs4xJoMZO_hhwgjcF2N85lZLuIAf2OKkyZ_Xp2DwVMYkbcvoLHazfuwb2zuIbc9oQkXetK2H0ys2toRQK-HkDQeDUnMFcv8FPxBUmprKHuiKR3aghzm/s640/Jarvis.png" width="640" /></a></div>
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden ponerla en comentarios.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<div style="text-align: left;">
<i><b><span style="font-family: Arial,Helvetica,sans-serif;">Ligas que me ayudaron: </span></b></i></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://grokbase.com/t/python/python-es/0559h4bhtk/imagen-en-tkinter">http://grokbase.com/t/python/python-es/0559h4bhtk/imagen-en-tkinter</a></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.cs.unc.edu/~snoeyink/demos/ch/Jarvis.html">http://www.cs.unc.edu/~snoeyink/demos/ch/Jarvis.html </a></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.ual.es/~fbeltran/envolvente/03.htm">http://www.ual.es/~fbeltran/envolvente/03.htm</a></span></div>
<div style="text-align: left;">
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://jc-info.blogspot.mx/2009/10/algoritmo-jarvis-march-cerradura.html">http://jc-info.blogspot.mx/2009/10/algoritmo-jarvis-march-cerradura.html</a></span></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos.</span></div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-84716930452950944992013-02-19T00:35:00.000-08:002013-02-19T00:35:18.645-08:00Tarea 2<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Tarea 2 - Detección de Figuras</span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Hola, la siguiente actividad de la clase de visión computacional consiste en implementar una subrutina del algoritmo BFS, para después detectar las distintas figuras presentes en una imagen, así como los centros de <span style="font-size: small;">masa</span>.</span></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">El requisito para realizar est<span style="font-size: small;">a a<span style="font-size: small;">cti<span style="font-size: small;">vidad<span style="font-size: small;"> es tener una imagen con los bordes detectados, <span style="font-size: small;">y tambi<span style="font-size: small;">én tiene que estar binari<span style="font-size: small;">zada (es <span style="font-size: small;">lo correspondiente a la tarea 1<span style="font-size: small;">, antes en<span style="font-size: small;">tregada</span></span></span>).</span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Mediante el algo<span style="font-size: small;">ritmo BFS encon<span style="font-size: small;">tramos las distintas figu<span style="font-size: small;">ras que componen la imagen, es<span style="font-size: small;">to <span style="font-size: small;">recorriendo los pixeles totales de la imag<span style="font-size: small;">en<span style="font-size: small;">, el algoritmo par<span style="font-size: small;">te d<span style="font-size: small;">e un nodo raiz <span style="font-size: small;">y <span style="font-size: small;">luego se van recorriendo los nodos vecinos, in<span style="font-size: small;">troduciendo en <span style="font-size: small;">u<span style="font-size: small;">n<span style="font-size: small;">a cola.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Como <span style="font-size: small;">ya tenemos la i<span style="font-size: small;">magen con bordes y binarizada el <span style="font-size: small;">algoritmo va <span style="font-size: small;">a estar delimitado por los rangos que <span style="font-size: small;">corresponden a las lineas blancas (los bordes), a<span style="font-size: small;">l ir r<span style="font-size: small;">ecorriendo los pixeles de una imagen lo voy pintando con un color random, dejand<span style="font-size: small;">o siempre el fondo (parte de mayo<span style="font-size: small;">r <span style="font-size: small;">porcentaje de la imag<span style="font-size: small;">en</span></span></span>) en colo<span style="font-size: small;">r<span style="font-size: small;"> gris (requerido en la tarea)<span style="font-size: small;">.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Este mismo proces<span style="font-size: small;">o es para detectar todos los objet<span style="font-size: small;">os o figuras de la imagen<span style="font-size: small;">. A<span style="font-size: small;">sí que en cada pixel <span style="font-size: small;">neg<span style="font-size: small;">ro de la imagen<span style="font-size: small;"> se buscará la figura, siempre <span style="font-size: small;">respetando <span style="font-size: small;">l<span style="font-size: small;">os contorno<span style="font-size: small;">s <span style="font-size: small;">o los bordes de cada figura.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">A<span style="font-size: small;"> c<span style="font-size: small;">ontinuación <span style="font-size: small;">la subrutina <span style="font-size: small;">bfs()<span style="font-size: small;">:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<pre class="brush:py">#Implelementacion de bfs ***************************************************
#***************************************************************************
def bfs(im, origen, color):
n = 0
pixel = im.load()
width, height = im.size
col = []
xsum = []
ysum = []
col.append(origen)
original = pixel[origen]
largo = len(col)
while largo > 0:
(x, y) = col.pop(0)
actual = pixel[x, y]
if actual == original or actual == color:
for dx in [-1, 0, 1]:
for dy in [-1, 0, 1]:
i, j = (x + dx, y + dy)
if i >= 0 and i < width and j >= 0 and j < height:
contenido = pixel[i, j]
if contenido == original:
pixel[i, j] = color
xsum.append(i)
ysum.append(j)
n += 1
col.append((i, j))
#im.save('bla01.jpg')
return n, xsum, ysum # el regreso para la funcion formas
#Para clasificar los objetos**********************************************
#*****************************************************************************
#*************************************************************************
</pre>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">U</span>n video muy bueno que ayuda a<span style="font-size: small;"> programa<span style="font-size: small;">r el BFS</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/5YsDIZ-bwjY?feature=player_embedded' frameborder='0'></iframe><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Ahora para pintar objetos, centros de masa y porcent<span style="font-size: small;">ajes:</span></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<pre class="brush:py">#Para clasificar los objetos**********************************************
#*****************************************************************************
#*************************************************************************
def formas():
im = Image.open("meh5.jpg") #Imagen con bordes y binarizada
width, height = im.size
total = width * height
porcentajes = []
centro = []
corr = 0 ##Solo para corroborar porcentajes
conteo = 0
pixel = im.load()
temp = []
colorsR = [] #Para guardar colores R
colorsG = [] #Para guardar colores G
colorsB = [] #Para guardar colores B
conteoColores = 0
for i in range(width): #Recorriendo imagen
for j in range(height): #Recorriendo imagen
if pixel[i, j] == (0, 0, 0): #Ir pintando pixeles (negros obviamente)
r, g, b = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) #Asignando pixeles random
n, x, y = bfs(im,(i,j),(r,g,b))
ptemp = float(n)/float(total) * 100.0 #Obteniendo porcentajes
if ptemp > 0.1:
centro.append((sum(x) / len(x), sum(y) / len(y))) #Localizando centros
porcentajes.append([ptemp, (r, g, b)])
conteo += 1
else:
temp.append((x, y))
fondo = porcentajes.index(max(porcentajes))
color = porcentajes[fondo][1]
for i in range(width):
for j in range(height):
if pixel[i, j] == color:
pixel[i, j] = (150, 150, 150)
for i in range(len(centro)):
if i == fondo:
pixel[centro[i]] = (255, 0, 0) #Para poner centros de masa
#Aqui va lo de las tags, proximamente en Tkinter o Pygame
else:
pixel[centro[i]] = (0, 0, 0)
im.save('bla02.jpg') #Imagen definitiva
conteo = 0
for ptemp in porcentajes:
print "Porcentaje de figura %s: %.2f"%(conteo, ptemp[0])
conteo = conteo+ 1
corr = ptemp[0] + corr
#print "Corroborando porcentaje: ", corr
# FIN ********************************************************************
</pre>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b><span style="font-family: Arial,Helvetica,sans-serif; font-size: large;">Resultados obtenidos:</span></b><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Para re<span style="font-size: small;">alizar las p<span style="font-size: small;">ruebas tuve <span style="font-size: small;">que poner imágenes <span style="font-size: small;">en las <span style="font-size: small;">que s<span style="font-size: small;">u cont<span style="font-size: small;">orno estu<span style="font-size: small;">viera bien definido, ya que con algunas pruebas <span style="font-size: small;">simplemente no<span style="font-size: small;"> era posible detectar las figuras que<span style="font-size: small;"> componian la imagen.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><i>1) Prueba 1</i></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></b><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">(Hacer cl<span style="font-size: small;">ick sobre la imagen para ampl<span style="font-size: small;">iar)</span></span></span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwrdq0F-FhtFYNYxqCLNtcY50alCfgNnoJcxofv1LNqHKsIgG5Odr7cXqXd-GzAEH9o3b2vjrqsfq_DAO-lOG9fyUb8OhdI4OCXrJpRlq_9OhfNJXDkpx7Dvoj0SiaKy8P7jfRslx8Deo/s1600/image1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwrdq0F-FhtFYNYxqCLNtcY50alCfgNnoJcxofv1LNqHKsIgG5Odr7cXqXd-GzAEH9o3b2vjrqsfq_DAO-lOG9fyUb8OhdI4OCXrJpRlq_9OhfNJXDkpx7Dvoj0SiaKy8P7jfRslx8Deo/s640/image1.png" width="640" /></a></div>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">Proceso<span style="font-size: small;">s de conversión en GIF<span style="font-size: small;">:</span></span></span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6OY51bzBuKMo1saCFkBPtGsospNkAGAn7nVTuY9-eNYFoV7FFx48e5ydaSlBI9uGL-WDYTLZsBavP5s_spLX5k0dZZGNdH0RC8ej8jVTf4GAWTsPQh9pimq3jk-iVSzQ-GG-Vez82T47g/s1600/newGif.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6OY51bzBuKMo1saCFkBPtGsospNkAGAn7nVTuY9-eNYFoV7FFx48e5ydaSlBI9uGL-WDYTLZsBavP5s_spLX5k0dZZGNdH0RC8ej8jVTf4GAWTsPQh9pimq3jk-iVSzQ-GG-Vez82T47g/s400/newGif.gif" width="400" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"> </span> </span> </span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><i><b>2) Pr</b></i><span style="font-size: small;"><i><b>ueba 2</b></i></span></span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">(Hacer cl<span style="font-size: small;">i<span style="font-size: small;">ck sobre la imagen para am<span style="font-size: small;">pliar</span></span></span>) </span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3uaKNgy9x_YYlgKjwr-GxtuThEFoQSaAvoQsSkKnBmn-urmwANBOAI4TN9TOoEnfF0xzNAlfTwSrYcMqO48SjcaS1nm6LBNE1qrAIX0ZVeKWIH8gWShIXirO_wGG4ZQ0dK82Ppvi7Hsh/s1600/imagen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3uaKNgy9x_YYlgKjwr-GxtuThEFoQSaAvoQsSkKnBmn-urmwANBOAI4TN9TOoEnfF0xzNAlfTwSrYcMqO48SjcaS1nm6LBNE1qrAIX0ZVeKWIH8gWShIXirO_wGG4ZQ0dK82Ppvi7Hsh/s640/imagen2.png" width="640" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><br /></span></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">Procesos de conversión en GI<span style="font-size: small;">F:</span></span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg58VCZzX3lJpsQZdglP5zRHNuf3x0Xg0Xp5wdkgNNq0oqd-ckG0-3_qqRpg5ZXqDxopalsfpf_PvB_AiBvjECucTp7KDkC5AdiEoXH0GbPnK5quQWAzKoVhR9QdDYsPNw87vywfPcriEKV/s1600/newGif.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg58VCZzX3lJpsQZdglP5zRHNuf3x0Xg0Xp5wdkgNNq0oqd-ckG0-3_qqRpg5ZXqDxopalsfpf_PvB_AiBvjECucTp7KDkC5AdiEoXH0GbPnK5quQWAzKoVhR9QdDYsPNw87vywfPcriEKV/s400/newGif.gif" width="400" /></a></div>
<br />
<i><b><span style="font-family: Arial,Helvetica,sans-serif;">3) Prueba 3</span></b></i><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">(Hacer cl<span style="font-size: small;">i<span style="font-size: small;">ck sobre la imagen para am<span style="font-size: small;">pliar</span></span></span>) </span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><br /></span></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZiOU-tySiEXXlIh2OQn-w1mMquW1bS7bX8EmXkvpIpMvm8e9B18mlGfN5_fRIwskAltOv3uIMf5O_CyWsFw9-6-SiQayt7vDVLPmvBsdPw4Qm4UCHjWJPB7Vl0RaDMLq9DyoFFuvm_pG7/s1600/image3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZiOU-tySiEXXlIh2OQn-w1mMquW1bS7bX8EmXkvpIpMvm8e9B18mlGfN5_fRIwskAltOv3uIMf5O_CyWsFw9-6-SiQayt7vDVLPmvBsdPw4Qm4UCHjWJPB7Vl0RaDMLq9DyoFFuvm_pG7/s640/image3.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><br /></span></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><br /></span></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">Procesos de conversión en GI<span style="font-size: small;">F:</span></span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpr9tYmjTJC7xgo1MGByOHsuK3AkF6_iF6NMh1pAZnUvXaKTi4Ssajhyphenhyphen7xZ-z-mYtRWo6sl2BNZWA0gs22wm25A108ch3QF_nUbfDq7OVpMJx_VHKrBSUH0l0swnTMKREOdvJfzOE6UEXu/s1600/newGif.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpr9tYmjTJC7xgo1MGByOHsuK3AkF6_iF6NMh1pAZnUvXaKTi4Ssajhyphenhyphen7xZ-z-mYtRWo6sl2BNZWA0gs22wm25A108ch3QF_nUbfDq7OVpMJx_VHKrBSUH0l0swnTMKREOdvJfzOE6UEXu/s400/newGif.gif" width="400" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Para obtener GIF's<span style="font-size: small;">, por <span style="font-size: small;">si les <span style="font-size: small;">interesa: <a href="http://andalinux.wordpress.com/2008/09/24/crear-gif-animados-en-ubuntu-linux/">http://andalinux.wordpress.com/2008/09/24/crear-gif-animados-en-ubuntu-linux/</a></span></span></span></span></span></span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">M<span style="font-size: small;">i liga<span style="font-size: small;"> de git: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana</a></span></span> </span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;">C<span style="font-size: small;">ualquier duda<span style="font-size: small;"> o aclaración pueden ponerla <span style="font-size: small;">en comen<span style="font-size: small;">tarios. </span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Saludos a todos!</span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com0tag:blogger.com,1999:blog-1310697525469401982.post-21757549449339914062013-02-13T20:36:00.001-08:002013-02-13T20:44:28.607-08:00Laboratorio 2<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Laboratorio 2 - Ruido sal y pimienta, normalización y binarización</span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Hola, en esta entrada voy a presentar el trabajo realizado para el laboratorio 2 de Visión computacional. </span></span></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br /></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Lo primero (obligatorio) que hice fue generar ruido de sal y pimienta en imágenes a colores, la manera en la que puse los puntos blancos y negros sobre la imagen fue muy sencilla. Cuando ejecuto el python, paso como parámetro 2 valores, el primero es la intensidad (ruido a generar en la imagen), y luego la polarización (que tan blancos o negros van a ser las sales y pimientas). El valor de la intensidad lo pongo dentro de un random para que la probabilidad en que salgan puntos (ya sea blancos o negros) dependan del valor dado.</span></span></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br /></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Luego el valor de la polarización lo determino mediante condicionales, para ver que tan negros o blancos pongo los ruidos, tomando en cuenta que el valor 0 corresponde a negro y el valor 255 corresponde a blanco, con el valor leido de polarización solo vario entre esos 2 números.</span></span></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Bueno, aquí muestro la subrutina con la que realicé el ruido:</span></span></div>
<br />
<pre class="brush:py">def salPimienta(): # Subrutina para poner sal y pimienta a la imagen binarizada
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
#Valores para instensidad y polarizacion respectivamente
intensidad = int(argv[1]) # Nivel de pixeles (cantidades)
polarizacion = int(argv[2]) # Que tan negros y blancos son los puntos en porcentaje... donde 0 es negro y 255 es blanco
im = Image.open("bla.jpg")
pix = im.load()
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
#pix = im.load()
tupla = pix[x, y]
azar = int(random.randint(0,intensidad))
if azar == 9: #Aqui podria ser perfectamente cualquier numero (no necesariamente 9), seria la misma probabilidad: 1/intensidad
if polarizacion > 25 and polarizacion < 75:
a = 128 + 64
b = 128 + 64 # Para puntos "blancos"
c = 128 + 64
# Fabricando la nueva tupla
tupla1 = (a, b, c)
# Poniendo pixel
im.putpixel((x, y), tupla1)
elif polarizacion >= 75:
a = 255
b = 255 # Para puntos "blancos"
c = 255
# Fabricando la nueva tupla
tupla1 = (a, b, c)
#Poniendo pixel
im.putpixel((x, y), tupla1)
elif polarizacion <= 25:
a = 128 + 20
b = 128 + 20 # Para puntos "blancos"
c = 128 + 20
# Fabricando la nueva tupla
tupla1 = (a, b, c)
#Poniendo pixel
im.putpixel((x, y), tupla1)
elif azar == 7:
if polarizacion > 25 and polarizacion < 75:
d = 128 - 64
e = 128 - 64 # Para puntos "negros"
f = 128 - 64
tupla2 = (d, e, f)
im.putpixel((x, y), tupla2)
elif polarizacion >= 75:
d = 0
e = 0 # Para puntos "negros"
f = 0
tupla2 = (d, e, f)
im.putpixel((x, y), tupla2)
elif polarizacion <= 25:
d = 128 - 20
e = 128 - 20 # Para puntos "negros"
f = 128 - 20
tupla2 = (d, e, f)
im.putpixel((x, y), tupla2)
else:
a = tupla[0]
b = tupla[1]
c = tupla[2]
newTupla = (a,b,c)
im.putpixel((x, y), newTupla)
#print tupla, "--", a,",",b,",",c
im.save('meh6.jpg')
#tiempoFinal = time.time()
#transcurso = tiempoFinal - tiempoInicial
#print "Tiempo de escala de grises = ", transcurso
</pre>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Ahora les muestro imágenes con distintos niveles de intensidad y polarización:</span></span><br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Intensidad 60%, polarización 50%) </span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKxDgJNj_1BKHjqKpI2kSZ1n5FghXIW7qteY0k4Fin3dF8r5PYq8RBem00hYWPr-NxkOYBUc1Aqoic-kCnrKP4NQ0I1S_DWRRb-j6vNUhK8fllZ7CkLZ3ZUCcHWEiOLDtoUBkzVNwXXpIa/s1600/imagen4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKxDgJNj_1BKHjqKpI2kSZ1n5FghXIW7qteY0k4Fin3dF8r5PYq8RBem00hYWPr-NxkOYBUc1Aqoic-kCnrKP4NQ0I1S_DWRRb-j6vNUhK8fllZ7CkLZ3ZUCcHWEiOLDtoUBkzVNwXXpIa/s400/imagen4.png" width="327" /></a></div>
<br />
<div style="text-align: center;">
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Intensidad 90%, polarización 100%)</span></span></div>
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6GbFX1ZuNqHCWc32s-F6UiGSikrhVvuqfALe9o9FxBRzpi3bll4KLcYwo7l_IKgoN4taFcqB1W_omYEZLCzt5u_jUVJSDRS2Da_EKesFf4YLITpzTEsc25qQUAl5ovZT9km5z2TpXuGN/s1600/imagen5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6GbFX1ZuNqHCWc32s-F6UiGSikrhVvuqfALe9o9FxBRzpi3bll4KLcYwo7l_IKgoN4taFcqB1W_omYEZLCzt5u_jUVJSDRS2Da_EKesFf4YLITpzTEsc25qQUAl5ovZT9km5z2TpXuGN/s400/imagen5.png" width="277" /></a></div>
<br /></div>
<div style="text-align: justify;">
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Ahora para quitar ese ruido generado hice otra subrutina, que lo que hace es compara pixel por pixel de la imagen, cuando detecta que el pixel es blanco o negro, genera un promedio con los valores de pixeles de los vecinos, seguido de eso el promedio obtenido se lo asigna al pixel en el que está posicionado.<br /><br /> A continuación les muestro la subrutina que realiza este proceso:</span></span><br />
<pre class="brush:py">def quitarSalPimienta():
i = 0
x = 0
y = 0
im = Image.open("meh6.jpg")
pix = im.load()
width, height = im.size
promedio = 0
width = width-1
height = height-1
#x = j y y = i
for x in range(height):
for y in range(width):
tupla = pix[y, x]
pR = tupla[0]
pG = tupla[1]
pB = tupla[2]
print tupla
#if (pB == 0 or pR == 255):
if (pR >= 240 or pG >= 240 or pB >= 240) or (pR <=10 or pG <=10 or pB <=10):
#esquina superior izquierda
if y == 0 and x == 0:
#promedio = (sum(pix[y + 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x])/3)/3
promedio1 = (pix[y + 1,x][0] + pix[y,x + 1][0])/2
promedio2 = (pix[y + 1,x][1] + pix[y,x + 1][1])/2
promedio3 = (pix[y + 1,x][2] + pix[y,x + 1][2])/2
#esquina superior derecha
if y == width and x == 0:
#promedio = (sum(pix[y,x+1])/3 + sum(pix[y-1,x])/3 + sum(pix[y,x])/3)/3
promedio1 = (pix[y,x+1][0] + pix[y-1,x][0])/2
promedio2 = (pix[y,x+1][1] + pix[y-1,x][1])/2
promedio3 = (pix[y,x+1][2] + pix[y-1,x][2])/2
if y == 0 and x == height:
#promedio = (sum(pix[y,x-1])/3 + sum(pix[y+1,x])/3 + sum(pix[y,x])/3)/3
promedio1 = (pix[y,x-1][0] + pix[y+1,x][0])/2
promedio2 = (pix[y,x-1][1] + pix[y+1,x][1])/2
promedio3 = (pix[y,x-1][2] + pix[y+1,x][2])/2
if y == height and x == width:
#promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x - 1])/3 + sum(pix[y,x])/3)/3
promedio1 = (pix[y - 1,x][0] + pix[y,x - 1][0])/2
promedio2 = (pix[y - 1,x][1] + pix[y,x - 1][1])/2
promedio3 = (pix[y - 1,x][2] + pix[y,x - 1][2])/2
if y > 0 and y < width and x == 0:
#promedio = (sum(pix[y+1,x])/3 + sum(pix[y-1,x])/3 +sum(pix[y,x+1])/3+ sum(pix[y,x])/3)/4
promedio1 = (pix[y+1,x][0] + pix[y-1,x][0] + pix[y,x+1][0])/3
promedio2 = (pix[y+1,x][1] + pix[y-1,x][1] + pix[y,x+1][1])/3
promedio3 = (pix[y+1,x][2] + pix[y-1,x][2] + pix[y,x+1][2])/3
if y > 0 and y < width and x == height:
#promedio = (sum(pix[y -1,x])/3 + sum(pix[y,x-1])/3 +sum(pix[y+1,x])/3+ sum(pix[y,x])/3)/4
promedio1 = (pix[y -1,x][0] + pix[y,x-1][0] + pix[y+1,x][0])/3
promedio2 = (pix[y -1,x][1] + pix[y,x-1][1] + pix[y+1,x][1])/3
promedio3 = (pix[y -1,x][2] + pix[y,x-1][2] + pix[y+1,x][2])/3
if x >0 and x <height 0:="" and="" if="" pix="" promedio1="(pix[y+1,x][0]" promedio2="(pix[y+1,x][1]" promedio3="(pix[y+1,x][2]" promedio="(sum(pix[y+1,x])/3" sum="" width="" x-1="" x="" y="=">0 and x < height:
#promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x-1])/3 + sum(pix[y,x +1])/3+ sum(pix[y,x])/3)/4
promedio1 = (pix[y - 1,x][0] + pix[y,x-1][0] + pix[y,x +1][0])/3
promedio2 = (pix[y - 1,x][1] + pix[y,x-1][1] + pix[y,x +1][1])/3
promedio3 = (pix[y - 1,x][2] + pix[y,x-1][2] + pix[y,x +1][2])/3
if y > 0 and y< width and x>0 and x< height:
#promedio = (sum(pix[y,x])/3 + sum(pix[y + 1,x])/3 + sum(pix[y - 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x -1])/3)/5
promedio1 = (pix[y + 1,x][0] + pix[y - 1,x][0] + pix[y,x + 1][0] + pix[y,x -1][0])/4
promedio2 = (pix[y + 1,x][1] + pix[y - 1,x][1] + pix[y,x + 1][1] + pix[y,x -1][1])/4
promedio3 = (pix[y + 1,x][2] + pix[y - 1,x][2] + pix[y,x + 1][2] + pix[y,x -1][2])/4
#-----------------------------
#tupla = pix[x, y]
a = promedio1
b = promedio2
c = promedio3
miTupla = (a,b,c) #Eso no es una tupla, pero asi le digo yo :P
im.putpixel((y, x), miTupla) #Esto si es una tupla
#pix[y, x] = (a,b,c)
else:
tuplaOriginal = (pR, pG, pB) #Esto tampoco es una tupla, pero asi le digo yo :P
im.putpixel((y, x), tuplaOriginal) #Esto si es una tupla XD
'''
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
'''
#print tupla, "--", a,",",b,",",c
im.save('meh7.jpg')
</height></pre>
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Ahora les muestro imágenes con ruido generado comparadas con las imágenes después de pasar por el fitro que limpia el ruido:</span></span></div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZcw4OpZYMyGS3MWBBlnUj3g22owyz-fQl8ktOk7AUV2IlwvPotQdKzP0lBU1GRpHa2xotlFfmK-goCePPDsnqq4Q3JMUBBEKhExwW4eimHmWqWnrYRa1vQre7byHO9_Z5apBdxOkmuPEE/s1600/image1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZcw4OpZYMyGS3MWBBlnUj3g22owyz-fQl8ktOk7AUV2IlwvPotQdKzP0lBU1GRpHa2xotlFfmK-goCePPDsnqq4Q3JMUBBEKhExwW4eimHmWqWnrYRa1vQre7byHO9_Z5apBdxOkmuPEE/s640/image1.png" width="640" /></a></div>
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="color: #444444;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"> </span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguBegUP_6LYj5fr8TWs51D0Kfu5Je9_LaEMy0XbrG0wxS4QrK1Gsk3uExkIXq96ToXQAjoBKWuMonXpGkSOygCuCEg1GyX8_rfZtcVnsuiBURGm0eHfydGryQJVWlqz6RqU4A-BCvTNo-y/s1600/imagen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguBegUP_6LYj5fr8TWs51D0Kfu5Je9_LaEMy0XbrG0wxS4QrK1Gsk3uExkIXq96ToXQAjoBKWuMonXpGkSOygCuCEg1GyX8_rfZtcVnsuiBURGm0eHfydGryQJVWlqz6RqU4A-BCvTNo-y/s640/imagen2.png" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="color: #444444;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><b><span style="font-size: large;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b></div>
<div style="text-align: justify;">
<div style="text-align: center;">
<b><span style="font-size: large;"><span style="font-family: Arial,Helvetica,sans-serif;">Normalización y binarización </span></span></b></div>
</div>
<div style="text-align: justify;">
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Bien, para los puntos extra, hice una imagen difusa, luego realicé la diferencia entre la imagen original y la difusa y al final realicé la normalizacion y binarización.<br /><br />Los métodos para realizar estos filtros los describí en el post anterior (Tarea 1), pero aquí explico superficialmente que la difusa la realicé con los promedios de los vecinos que se van visitando en cada pixel, la diferencia es tan solo una resta entre los valores de los pixeles que componen la imagen original y la imagen difusa. La normalización y binarización se realizan tan solo poniendo umbrales y comparando que tan oscuros o claros son los valores de los pixeles, para luego ponerlos en una categoría de blanco o negro (0 o 255).<br /><br />A continuación les muestro la subrutina del proceso de difusa:</span></span><br />
<br />
<pre class="brush:py">def filtrada(): #Filtrada por el metodo de los vecinos
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
im = Image.open("meh.jpg")
width, height = im.size
pix = im.load()
promedio = 0
width = width-1
height = height-1
#x = j y y = i
for x in range(height):
for y in range(width):
#esquina superior izquierda
if y == 0 and x == 0:
promedio = (sum(pix[y + 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x])/3)/3
#esquina superior derecha
if y == width and x == 0:
promedio = (sum(pix[y,x+1])/3 + sum(pix[y-1,x])/3 + sum(pix[y,x])/3)/3
if y == 0 and x == height:
promedio = (sum(pix[y,x-1])/3 + sum(pix[y+1,x])/3 + sum(pix[y,x])/3)/3
if y == height and x == width:
promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x - 1])/3 + sum(pix[y,x])/3)/3
if y > 0 and y < width and x == 0:
promedio = (sum(pix[y+1,x])/3 + sum(pix[y-1,x])/3 +sum(pix[y,x+1])/3+ sum(pix[y,x])/3)/4
if y > 0 and y < width and x == height:
promedio = (sum(pix[y -1,x])/3 + sum(pix[y,x-1])/3 +sum(pix[y+1,x])/3+ sum(pix[y,x])/3)/4
if x >0 and x <height 0:="" and="" if="" pix="" promedio="(sum(pix[y+1,x])/3" sum="" width="" x-1="" x="" y="=">0 and x < height:
promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x-1])/3 + sum(pix[y,x +1])/3+ sum(pix[y,x])/3)/4
if y > 0 and y< width and x>0 and x< height:
promedio = (sum(pix[y,x])/3 + sum(pix[y + 1,x])/3 + sum(pix[y - 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x -1])/3)/5
#-----------------------------
#tupla = pix[x, y]
a = promedio
b = promedio
c = promedio
'''
a = tupla[0]
b = tupla[1]
c = tupla[2]
'''
#prom = int((a+b+c)/3)
pix[y, x] = (a,b,c)
#tup = pix[]
#im.putpixel((y, y), pix)
#print tupla, "--", a,",",b,",",c
im.save('meh2.jpg')
#tiempoFinal = time.time()
#transcurso = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la filtracion = ", transcurso
</height></pre>
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Luego la diferencia y la binarización:</span></span><br />
<br />
<pre class="brush:py">def diferencia(): #O normalizacion
#tiempoInicial = time.time()
imagen1 = Image.open("meh.jpg")
imagen2 = Image.open("meh2.jpg")
width, height = imagen1.size
pix = imagen1.load()
pix2 = imagen2.load()
for y in range(width):
for x in range(height):
(a,b,c) = pix[y, x]
(d,e,f) = pix2[y, x]
promedio = a+b+c/3
promedio1 = d+e+f/3
promedio2 = promedio - promedio1
if promedio2 > 115:
promedio2 = 255
else:
promedio2 = 0
a = promedio2
b = promedio2
c = promedio2
pix[y, x] = (a,b,c)
imagen1.save("meh3.jpg")
#tiempoFinal = time.time()
#transcurso = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la normalizacion = ", transcurrido
</pre>
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Subrutina para binarización:</span></span><br />
<br />
<pre class="brush:py">def umbrales():
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
umbInferior = 77
umbSuperior = 177
im = Image.open("meh4.jpg")
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
if prom < umbInferior:
prom = 0
elif prom >= umbSuperior:
prom = 255
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
#print tupla, "--", a,",",b,",",c
im.save('meh5.jpg')
#tiempoFinal = time.time()
#transcurrido = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la binarizacion = ", transcurrido
</pre>
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Ya por último les muestro las imágenes después de pasar por todos los procesos antes mencionados:</span></span><br />
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Original) </span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdWQvhsLeeJmidFgLpeVtsB9Yg4gd2S-gMytqbdcIpe8HZuHtCMBB8TVSGOpAR6bQOmM4yQdhoII603kX1ni2aPD0rQoVnsHWhQXtdoagtRW2vxgL12bJYzo79DJWUnAP4WvsRckvfFVYx/s1600/bla.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdWQvhsLeeJmidFgLpeVtsB9Yg4gd2S-gMytqbdcIpe8HZuHtCMBB8TVSGOpAR6bQOmM4yQdhoII603kX1ni2aPD0rQoVnsHWhQXtdoagtRW2vxgL12bJYzo79DJWUnAP4WvsRckvfFVYx/s400/bla.jpg" width="400" /></a></div>
<br />
<br />
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Escala de grises)</span></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu-6-7KUCJqUuhAf7rVim-VCWMMJftXu4pG6-UqkZW65kDU0W_DLwADkmrRL2C2oi1RBRFtrXH3tvJIyaxS2EyjGfhfy-z2eLBH_eQY4cQBsyzO4XBZsS5aPitCAuQ5bPxVCjIoLsaALpA/s1600/meh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu-6-7KUCJqUuhAf7rVim-VCWMMJftXu4pG6-UqkZW65kDU0W_DLwADkmrRL2C2oi1RBRFtrXH3tvJIyaxS2EyjGfhfy-z2eLBH_eQY4cQBsyzO4XBZsS5aPitCAuQ5bPxVCjIoLsaALpA/s400/meh.jpg" width="400" /></a></div>
<br />
<br />
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Difusa)</span></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqGUdDR4cagTDVu_vf1nn7IK7MKNZndQT-GxUhtY8ma1elshI0PkvFCVuT3N0WfsI3mYzrDQJ9xRhSzIF_l21Gx-eGYTQ_ffP1kd0RmQmprwk2NO7g5-eC9T9vLphr-leECya5xDxwslJC/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqGUdDR4cagTDVu_vf1nn7IK7MKNZndQT-GxUhtY8ma1elshI0PkvFCVuT3N0WfsI3mYzrDQJ9xRhSzIF_l21Gx-eGYTQ_ffP1kd0RmQmprwk2NO7g5-eC9T9vLphr-leECya5xDxwslJC/s400/meh2.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Diferencia)</span></span></div>
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfI2Ba9pXHwuKiPKpquZik4fAkdSSvU_9J8yKfSY2znP6b9iAHhD2Xf4aMMJn6f4q9l33H_rKjZQ6mKlGPcX2kxenlgyGbGh7oPMF-ZdcKZnhQpGRchaeWCMS0ZQds2VjkueYiO0grb_G/s1600/meh3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfI2Ba9pXHwuKiPKpquZik4fAkdSSvU_9J8yKfSY2znP6b9iAHhD2Xf4aMMJn6f4q9l33H_rKjZQ6mKlGPcX2kxenlgyGbGh7oPMF-ZdcKZnhQpGRchaeWCMS0ZQds2VjkueYiO0grb_G/s400/meh3.jpg" width="400" /></a></div>
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: center;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">(Binarización)</span></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjrCe7uIDwgGnu_p4wZv-rA4zP3pYZMQhdb_fhPwyH-2NRSGejrKZhluY-qV3ZVHmQdrDqRPaE39b1sedQo2xSnrPMkUac4e8mMXLbo4kSz6UC0vcp-Q1lgX8eC2reHg-igPqwpon4xOoq/s1600/meh4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjrCe7uIDwgGnu_p4wZv-rA4zP3pYZMQhdb_fhPwyH-2NRSGejrKZhluY-qV3ZVHmQdrDqRPaE39b1sedQo2xSnrPMkUac4e8mMXLbo4kSz6UC0vcp-Q1lgX8eC2reHg-igPqwpon4xOoq/s400/meh4.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Git sobre todo el trabajo realizado hasta ahora: <a href="https://github.com/eddypre/VisionTriana">https://github.com/eddypre/VisionTriana </a></span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="color: #444444;"><span style="font-size: small;"> </span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="color: #444444;"><span style="font-size: small;"> </span></span></span></span><span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Cualquier duda o aclaración pueden dejarla en comentarios.<br /><br />Saludos a todos! </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="color: #444444;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"> </span></span></span></span></span></span> </div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-53969276330552095882013-02-11T10:11:00.004-08:002013-02-11T21:38:33.144-08:00Tarea 1 (Clase) Visión Computacional<div style="text-align: center;">
<span style="color: #073763;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Detección de bordes por medio del operador Sobel</span></span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hola, esta es la tarea 1 de la clase de visión computacional, la actividad consiste en detectar bordes en distintas imágenes, mediante la utilización de filtros, umbrales, máscaras (técnica del operador de Sobel, o cualquier otra técnica).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Una vez detectados los bordes con las técnicas requeridas, realicé la actividad con 3 fotografías distintas, y para cada fotografía calculé el promedio que se llevaba de tiempo en ejecutar cada subrutina usada para obtener los bordes;</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">las subrutinas las corrí 30 veces para cada imagen (como el requisito de la tarea lo menciona).</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bien, dicho esto voy a mencionar detalladamente el trabajo que realicé.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-size: large;">Escala de grises</span></b></span> </div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Lo primero que realicé fue generar una imagen a escala de grises a partir de la imagen original. Está técnica la expliqué previamente en el laboratorio 1 de esta misma materia, pero repetiré en que consiste el procedimiento.</span></div>
<div style="text-align: justify;">
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Consiste en que se recorre todos y cada uno de los pixeles de la imagen, en cada pixel que se va recorriendo, se va sacando un promedio de los valores RGB de cada uno, para luego ese promedio asignarlo como el nuevo valor de pixel en los 3 valores de RGB, de manera que cada pixel recorrido tendrá los 3 valores iguales.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Por ejemplo supongamos que tenemos un pixel con los componentes RGB (35, 100, 150), el procedimiento sería sumar los 3 valores (35+100+150), luego dividirlos entre 3 (promedio) para luego el resultado obtenido asignárselo al mismo pixel en sus 3 posiciones RGB.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación les muestro la subrutina que hace este procedimiento, además de la imagen original con la que trabajé y la imagen a escala de grises obtenida.</span></div>
<br />
<pre class="brush:py">def transformar():
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
im = Image.open("bla.jpg")
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
#print tupla, "--", a,",",b,",",c
im.save('meh.jpg')
#tiempoFinal = time.time()
#transcurso = tiempoFinal - tiempoInicial
#print "Tiempo de escala de grises = ", transcurso
</pre>
<div style="text-align: center;">
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Imagen original (660<span style="font-size: small;">x495</span>)</b></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b> </b></span></span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvPA2Ny4HlJP0o03Zfnsu4gy5QfMDp8uECQ1iY6ZiLiXjb7zqsBBNMAwddZ9cMZ7cgyQJL4YnyUB9yHL-FgC4pmhuZG9IC0ltGkKCNLtZBPcQSBbkCwF3LUmRM1UZeZgdwjkvctDKUfVcY/s1600/bla.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvPA2Ny4HlJP0o03Zfnsu4gy5QfMDp8uECQ1iY6ZiLiXjb7zqsBBNMAwddZ9cMZ7cgyQJL4YnyUB9yHL-FgC4pmhuZG9IC0ltGkKCNLtZBPcQSBbkCwF3LUmRM1UZeZgdwjkvctDKUfVcY/s400/bla.jpg" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Imagen a escala de grises </b></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGeb0yAjGEkj5RooppN4hm93AvKwGlhk2BNA8WY5df44Zd-IgKbL4665vZzeV95OdBqm1e-3STYi8cdF_yiie-gYjy2gDk6cuvz7a7Qum0gRtlNwK5S8n-uaCYQsumrCRsw13ts0WmamLe/s1600/meh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGeb0yAjGEkj5RooppN4hm93AvKwGlhk2BNA8WY5df44Zd-IgKbL4665vZzeV95OdBqm1e-3STYi8cdF_yiie-gYjy2gDk6cuvz7a7Qum0gRtlNwK5S8n-uaCYQsumrCRsw13ts0WmamLe/s400/meh.jpg" width="400" /></a></div>
<br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-size: large;">Filtro</span></b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">El siguiente procedimiento que realicé fue el de filtrado de la imagen, consiste en hacer un efecto blur en la imagen procesada anteriormente (escala de grises), para realizar esto, usé la técnica de los vecinos, que consiste en realizar un promedio con los valores de los pixeles de los vecinos que colindan con el pixel sobre el que estamos posicionados (recordemos que ahora cada pixel tiene los valores iguales de RGB, porque ahora está en escala de grises), seguido de esto, se asigna a ese pixel el valor obtenido.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Dicho esto, podemos concluir que el número máximo de vecinos que se pueden tener son 4, y el mínimo número de vecinos son 2 (los pixeles de las esquinas).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación les muestro la subrutina con la que hice este proceso, además de la imagen obtenida después del filtrado:</span><br />
<br />
<pre class="brush:py">def filtrada(): #Filtrada por el metodo de los vecinos
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
im = Image.open("meh.jpg")
width, height = im.size
pix = im.load()
promedio = 0
width = width-1
height = height-1
#x = j y y = i
for x in range(height):
for y in range(width):
#esquina superior izquierda
if y == 0 and x == 0:
promedio = (sum(pix[y + 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x])/3)/3
#esquina superior derecha
if y == width and x == 0:
promedio = (sum(pix[y,x+1])/3 + sum(pix[y-1,x])/3 + sum(pix[y,x])/3)/3
if y == 0 and x == height:
promedio = (sum(pix[y,x-1])/3 + sum(pix[y+1,x])/3 + sum(pix[y,x])/3)/3
if y == height and x == width:
promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x - 1])/3 + sum(pix[y,x])/3)/3
if y > 0 and y < width and x == 0:
promedio = (sum(pix[y+1,x])/3 + sum(pix[y-1,x])/3 +sum(pix[y,x+1])/3+ sum(pix[y,x])/3)/4
if y > 0 and y < width and x == height:
promedio = (sum(pix[y -1,x])/3 + sum(pix[y,x-1])/3 +sum(pix[y+1,x])/3+ sum(pix[y,x])/3)/4
if x >0 and x <height 0:="" and="" if="" pix="" promedio="(sum(pix[y+1,x])/3" sum="" width="" x-1="" x="" y="=">0 and x < height:
promedio = (sum(pix[y - 1,x])/3 + sum(pix[y,x-1])/3 + sum(pix[y,x +1])/3+ sum(pix[y,x])/3)/4
if y > 0 and y< width and x>0 and x< height:
promedio = (sum(pix[y,x])/3 + sum(pix[y + 1,x])/3 + sum(pix[y - 1,x])/3 + sum(pix[y,x + 1])/3 + sum(pix[y,x -1])/3)/5
#-----------------------------
#tupla = pix[x, y]
a = promedio
b = promedio
c = promedio
'''
a = tupla[0]
b = tupla[1]
c = tupla[2]
'''
#prom = int((a+b+c)/3)
pix[y, x] = (a,b,c)
#tup = pix[]
#im.putpixel((y, y), pix)
#print tupla, "--", a,",",b,",",c
im.save('meh2.jpg')
#tiempoFinal = time.time()
#transcurso = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la filtracion = ", transcurso
</height></pre>
<div style="text-align: center;">
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Imagen filtrada</b></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk0luqXCkuqTjACNl9xzuNCToLqZX_pFFAVqaNf4w8xEyLcZLCO8qsyOKIHWo_RAepwvNR_6MOlQRudn18-mOOZrwkmEGC-mstF502sYv_Oe-biFrygYSzATU27Rv40AQNK6XRyuJ_B5UC/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk0luqXCkuqTjACNl9xzuNCToLqZX_pFFAVqaNf4w8xEyLcZLCO8qsyOKIHWo_RAepwvNR_6MOlQRudn18-mOOZrwkmEGC-mstF502sYv_Oe-biFrygYSzATU27Rv40AQNK6XRyuJ_B5UC/s400/meh2.jpg" width="400" /></a></div>
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-size: large;">Aplicación de máscara</span></b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">En el proceso de la aplicación de la máscara, es en el que obtendremos los bordes de la imagen, existen distintos métodos para la obtención de bordes, sin embargo, el que yo usé es el del operador de Sobel, que es una máscara típica de detección de bordes, perteneciente a las técnicas de gradiente diferencial (DG).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">El procedimiento consiste en ir recorriendo toda la imagen pixel por pixel con una máscara o matriz de dimensiones 3x3 (por lo menos es de 3x3 con este método), y la idea es ir obteniendo los productos de la matriz que abarca la máscara en la imagen por los elementos de la misma matriz, de esa manera obtenemos un único valor de gradienteX y uno de gradiente Y, al final se obtiene un gradiente resultante (obviamente se obtiene apartir de los componentes de los gradientesX y gradientesY). El gradiente resultante será el nuevo valor del pixel sobre el que estamos posicionados.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Las siguientes son las matrices para obtener gradiente x (a la izquiera) y gradiente y (a la derecha), donde la A es la imagen original (en mi caso la imagen después de ser pasada por el filtro)</span> </div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnV_zYQ9_0zpJuYYFpNmpFY9xaD6MIhXQ8L7zBbKf6KyEAXCBqxvDbN6DRmooTcMIxXrNuvKWve2x6QFsuFSjvukLy8nPrYChqAwe3FsRZPGhvYe-zzt5o1SRsk9vG6wWn9w-dokRv7Dlm/s1600/sobel1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnV_zYQ9_0zpJuYYFpNmpFY9xaD6MIhXQ8L7zBbKf6KyEAXCBqxvDbN6DRmooTcMIxXrNuvKWve2x6QFsuFSjvukLy8nPrYChqAwe3FsRZPGhvYe-zzt5o1SRsk9vG6wWn9w-dokRv7Dlm/s400/sobel1.png" width="400" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Luego después de obtener los componentes de los gradientes, obtenemos el gradiente resultante mediante la siguiente ecuación:</span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPWG9mVzGH2623CW4dseXuupxuMmpQwFXf-GDeoMq8RsmXexEuBMt-1qnW1ArTPPRKfp6ZyAYkjIPN3xdYEriucGd8lrk-4HKl6vGPhTxUVR6wDSTA4jzOBoR_ZpZWPjJIr8UXqO70jrRn/s1600/sobel3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPWG9mVzGH2623CW4dseXuupxuMmpQwFXf-GDeoMq8RsmXexEuBMt-1qnW1ArTPPRKfp6ZyAYkjIPN3xdYEriucGd8lrk-4HKl6vGPhTxUVR6wDSTA4jzOBoR_ZpZWPjJIr8UXqO70jrRn/s1600/sobel3.png" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Si quieren obtener información más detallada de este operador Sobel, pueden visitar la siguiente liga: <a href="http://es.wikipedia.org/wiki/Operador_Sobel">http://es.wikipedia.org/wiki/Operador_Sobel</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Bien, a continuación les dejo la subrutina correspondiente a este procedimiento, además de la imagen obtenida después del proceso (nótese que la imagen tiene una línea blanca en su contorno, esto es el resultado de centrar el campo de trabajo, para que la mascara abarque siempre las dimensiones en la imagen, osea una matriz de 3x3):</span><br />
<br />
<pre class="brush:py">def convolucion():
#tiempoInicial = time.time()
''' --- --- --- ---
| -1 0 1 | | 1 2 1 |
SOBEL: Sx = | -2 0 2 | Sy = | 0 0 0 |
| -1 0 1 | |-1 -2 -1 |
--- --- --- ---
S = raiz(Sx2+Sy2)
'''
im = Image.open("meh2.jpg")
width, height = im.size
pix = im.load()
resultado = 0
gradienteX = ([-1, 0, 1], [-2, 0, 2], [-1, 0, 1]) #Valores establecidos por medio del operador Sobel
gradienteY = ([1, 2, 1], [0, 0, 0], [-1, -2, -1]) #Para gradiente de y, el de arriba es el gradiente de x.
sumasX = 0
sumasY = 0
for x in range(height):
for y in range(width):
sumasX = 0
sumasY = 0
if x != 0 and y != 0 and y != width and x != height: #Para obtener un centrado de la mascara, evita la primera linea de pixeles de la imagen por los 4 lados
#x = a
#y = b
for a in range(3): #Debido a que la matriz de los gradientes es de 3x3
for b in range(3):
try:
productosGX = gradienteX[a][b]*pix[y+b, x+a][1] #Obteniendo el valor de gradiente X
productosGY = gradienteY[a][b]*pix[y+b, x+a][1] #Obteniendo el valor de gradiente Y
except:
productosGX = 0
productosGY = 0
sumasX = productosGX+sumasX #Adicionando los valores del gradiente X
sumasY = productosGY+sumasY #Adicionando los valores del gradiente Y
potenciaGradienteX = pow(sumasX, 2) #Obteniendo el cuadrado del gradiente X
potenciaGradienteY = pow(sumasY, 2) #Obteniendo el cuadrado del gradiente Y
Gradiente = int(sqrt(potenciaGradienteX+potenciaGradienteY)) #Para obtener el gradiente por medio de los componentes x, y
#resultado = Gradiente
if Gradiente > 255: #Por si se pasan los valores
Gradiente = 255
if Gradiente < 0: #Para estar dentro del rango (0, 255)
Gradiente = 0
pix[y,x] = (Gradiente, Gradiente, Gradiente) # Creando el pixel nuevo con el gradiente obtenido
im.save('meh4.jpg')
#tiempoFinal = time.time()
#transcurrido = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la convolucion = ", transcurrido
</pre>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Imagen con bordes</b></span></div>
<div style="text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHlPnnfnX2NFI7GPPXyVjJyidImG-wveAMzAVHcF_dqEfRHy7GupNyJUXkMU4SfmSQkyCIdb9P67Vy-bOHn4ctqCVWeF8ZLkoGSj2IMEnp7SB7XoaxutfMWN91Oc52ePTTSqDk2M93Xefh/s1600/meh4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHlPnnfnX2NFI7GPPXyVjJyidImG-wveAMzAVHcF_dqEfRHy7GupNyJUXkMU4SfmSQkyCIdb9P67Vy-bOHn4ctqCVWeF8ZLkoGSj2IMEnp7SB7XoaxutfMWN91Oc52ePTTSqDk2M93Xefh/s400/meh4.jpg" width="400" /></a></div>
<br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-size: large;">Binarizació<span style="font-size: large;">n</span></span></b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Para pulir los detalles y además hacer más notables los negros y blancos de la imagen, binaricé la imagen, aplicando umbrales preestablecidos, de esa manera, mi imagen ahora solo tendría pixeles negros y blancos.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">El cambio en la imagen si es bastante notable y se aprecia todavía mejor el contorno.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">A continuación les dejo la subrutina correspondiente a este procedimiento (no es necesario explicarla ya que el funcionamiento es demasiado sencillo), además de la imagen obtenida:</span><br />
<br />
<pre class="brush:py">def umbrales():
#tiempoInicial = time.time()
i = 0
x = 0
y = 0
umbInferior = 77
umbSuperior = 177
im = Image.open("meh4.jpg")
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
if prom < umbInferior:
prom = 0
elif prom >= umbSuperior:
prom = 255
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
#print tupla, "--", a,",",b,",",c
im.save('meh5.jpg')
#tiempoFinal = time.time()
#transcurrido = tiempoFinal - tiempoInicial
#print "Tiempo transcurrido durante la binarizacion = ", transcurrido
</pre>
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Imagen binarizada</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicX0DIAaQANVnIAdkI3C3QmgN0dH31vtwGVcUT1zcsoLhpmsWlKdBAMam3XbJpPvdfwnOO-mMjYK8rP5TVSEwvS4fOFm56uV_cgAA9jo-U1ERVqrTQDK0HvKZqbVddCgiQBrBwi1jfroHm/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicX0DIAaQANVnIAdkI3C3QmgN0dH31vtwGVcUT1zcsoLhpmsWlKdBAMam3XbJpPvdfwnOO-mMjYK8rP5TVSEwvS4fOFm56uV_cgAA9jo-U1ERVqrTQDK0HvKZqbVddCgiQBrBwi1jfroHm/s400/meh5.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Por último ejecuté cada subrutina 30 veces para poder formar un promedio de tiempo de ejecución de cada una. Así es como se ve la impresión de los tiempos de la imagen anteriormente presentada.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBzHHhyphenhyphenbmULDV7oYZpFm1t_iTbmrYbn6yuziMZHXAthz1imPqmPKYa_qasKCaMYEkx9ReBxa91GS2HV1u__fMaZwX-eDR-H9lqlbrOXHna-RBe5kOtxTqujqeEM1-DLSTG1D-LmzY4TI4x/s1600/tarea1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBzHHhyphenhyphenbmULDV7oYZpFm1t_iTbmrYbn6yuziMZHXAthz1imPqmPKYa_qasKCaMYEkx9ReBxa91GS2HV1u__fMaZwX-eDR-H9lqlbrOXHna-RBe5kOtxTqujqeEM1-DLSTG1D-LmzY4TI4x/s400/tarea1.png" width="400" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Y también hice lo mismo con 2 imágenes más, de distinto tamaño y contenido.</span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Original (900x904)</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3x0QpinCyEudtfJ74fZyD6cpbmvDVw_NjdwVh3mwbDGkvQoRg_KGezp2Tkox1u9Rxu6OPhY1Tcyj1XSc6BgYORJ0PU64sw_vmSpq8ZoqSbsBmqJx72xaIgEUDb8kDbqfs_oJNUf7ceGte/s1600/bla.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3x0QpinCyEudtfJ74fZyD6cpbmvDVw_NjdwVh3mwbDGkvQoRg_KGezp2Tkox1u9Rxu6OPhY1Tcyj1XSc6BgYORJ0PU64sw_vmSpq8ZoqSbsBmqJx72xaIgEUDb8kDbqfs_oJNUf7ceGte/s200/bla.jpg" width="198" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Escala de grises</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_56m4nJ5dkg6vHjfoqSFHKWJyXVuy1jYwtQKuxMrBmq4d56euBCluRNe6xyZKFJiIVOCx203P21wWZDV0qo2s6RnwFruBj0V05gPU1su3Ux67qRlGh7-Fk9zYabW8-hfItH4cdaftmUjU/s1600/meh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_56m4nJ5dkg6vHjfoqSFHKWJyXVuy1jYwtQKuxMrBmq4d56euBCluRNe6xyZKFJiIVOCx203P21wWZDV0qo2s6RnwFruBj0V05gPU1su3Ux67qRlGh7-Fk9zYabW8-hfItH4cdaftmUjU/s200/meh.jpg" width="198" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Filtrada</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIjE4YYRI88R3iEpp3sp72c_VOKeEI_ALq4CHCnx2RWCyI91XKYERsWSaNET5p1sTauC4ZsjtdOZINOWQbbqwaI3zKrv9Mu1_o2rlqB8wqhJwqSkQEkoVkFy-JGiOpdq1JZiIWsR1MsWva/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIjE4YYRI88R3iEpp3sp72c_VOKeEI_ALq4CHCnx2RWCyI91XKYERsWSaNET5p1sTauC4ZsjtdOZINOWQbbqwaI3zKrv9Mu1_o2rlqB8wqhJwqSkQEkoVkFy-JGiOpdq1JZiIWsR1MsWva/s200/meh2.jpg" width="198" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Aplicando máscara</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiju2lPl4Azn7tZmDQDSUvuoFrVCxoTg5l30NnBqSXzbX8OL1cpk0zl0Kuxd-7N71vJhw88jGOkxtzsc1nJo_dhWG9owmGtkPxanc6FgkiQRQ3daezvQojyyopcyHCEmp3mhXVpu6WHrBBT/s1600/meh4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiju2lPl4Azn7tZmDQDSUvuoFrVCxoTg5l30NnBqSXzbX8OL1cpk0zl0Kuxd-7N71vJhw88jGOkxtzsc1nJo_dhWG9owmGtkPxanc6FgkiQRQ3daezvQojyyopcyHCEmp3mhXVpu6WHrBBT/s200/meh4.jpg" width="198" /></a></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Binarización</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDbMk90Vjs7vYIw86B5b8PtmF3dPsi99dKGDbCl6jopcTbL1r8m1Wj2WRcehtAPZjlBEhJ9AIge1F1YLKF4IFESMVkbYIM2o-3hqc3QZnJfXsKpSN3Pj_6rE1z1h-xrIEKcHrrBhslQnjF/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDbMk90Vjs7vYIw86B5b8PtmF3dPsi99dKGDbCl6jopcTbL1r8m1Wj2WRcehtAPZjlBEhJ9AIge1F1YLKF4IFESMVkbYIM2o-3hqc3QZnJfXsKpSN3Pj_6rE1z1h-xrIEKcHrrBhslQnjF/s200/meh5.jpg" width="198" /></a></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Promedio de tiempos para cada subrutina</b></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Noten que tarda más tiempo que la primera imagen, esto debido a que las dimensiones de esta imagen son más grandes</span><b><span style="font-family: Arial,Helvetica,sans-serif;"> </span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQn_f0Lrxg_9LaJFQVxG9tQoIztpR7kKFZUQvGcrfB2AGpnd_1ZwZMLKxmzw2fj4GlYVMsLibc8fWuShYp5QkhQ8bRKRSEttJUqBBwd6XqKyl6vIyMFK6LhpRiL01VPL0B8eQITm-P9G_c/s1600/imagen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQn_f0Lrxg_9LaJFQVxG9tQoIztpR7kKFZUQvGcrfB2AGpnd_1ZwZMLKxmzw2fj4GlYVMsLibc8fWuShYp5QkhQ8bRKRSEttJUqBBwd6XqKyl6vIyMFK6LhpRiL01VPL0B8eQITm-P9G_c/s400/imagen2.png" width="400" /></a></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Ahora otra imagen de menores dimensiones que las 2 anteriores:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Imagen original (256x256)</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2H7_FgeJ9gnUt602XG4bs4AajvhffLDtZ592xki86s7Mi576KsxdHSous43P53NVWZ_oMUr2pr1yTzVFx10la0SdpSfCawSbC4WrrqqR79TCL3MDlMyQbhFNxhcM9SAZc9jGkt2FjDWyl/s1600/bla.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2H7_FgeJ9gnUt602XG4bs4AajvhffLDtZ592xki86s7Mi576KsxdHSous43P53NVWZ_oMUr2pr1yTzVFx10la0SdpSfCawSbC4WrrqqR79TCL3MDlMyQbhFNxhcM9SAZc9jGkt2FjDWyl/s200/bla.jpg" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Escala de grises</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtwL23C2qqTiiqnQAETCqngmLM-fyTEowM4BM89XZVJHspxjQqAJYWvDLIJy9RQj4LlwEkL4YrN0O9yiOCNHxmv0AE73_m9OI_X0fhPlrcJve-hmJh-z3EVKSMw4zgwtgEde57c27vOCrQ/s1600/meh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtwL23C2qqTiiqnQAETCqngmLM-fyTEowM4BM89XZVJHspxjQqAJYWvDLIJy9RQj4LlwEkL4YrN0O9yiOCNHxmv0AE73_m9OI_X0fhPlrcJve-hmJh-z3EVKSMw4zgwtgEde57c27vOCrQ/s200/meh.jpg" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Filtro</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin1oSu8Dc1xI_zmZyb3K3xfJyArYrK3ro-NoTh-72Tmo7yAdQiv8uofZ5TUtUV_MB-EqFSGbTFpXystrZEGioPkTr4wAppDSsfhSKHKNHrZNV8U8mDD-5ZGNCAK5uq1mf9w5VrgEL1G7gJ/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin1oSu8Dc1xI_zmZyb3K3xfJyArYrK3ro-NoTh-72Tmo7yAdQiv8uofZ5TUtUV_MB-EqFSGbTFpXystrZEGioPkTr4wAppDSsfhSKHKNHrZNV8U8mDD-5ZGNCAK5uq1mf9w5VrgEL1G7gJ/s200/meh2.jpg" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif;">Aplicando máscara</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcoXaPDByo1FRQziYsPhbohUNO_jd4e6QO14AmtJnvrp5SVWeii5ZSfxdwZhW_MJsF2XaExYl5P6vZFQF66WhanHFq09Lcp4jCK6BGUtc0R8dBPxUB9u6yB5D5wG6JWDrNo9pILLEI4Sao/s1600/meh4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcoXaPDByo1FRQziYsPhbohUNO_jd4e6QO14AmtJnvrp5SVWeii5ZSfxdwZhW_MJsF2XaExYl5P6vZFQF66WhanHFq09Lcp4jCK6BGUtc0R8dBPxUB9u6yB5D5wG6JWDrNo9pILLEI4Sao/s200/meh4.jpg" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Binarización</b></span></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfB9dp3vYg2IGvF9FhSu-QJ5ZQ-UrRdM1tiCSoMRwY3uX-Qw27rBJyEjzJajqyuhyphenhyphenwVCyFxDWc1C_X2hWKK081CORLjpnkHLUb4LM95DcI9w2Pzbbh9UmeFXCP9IQ2U9aeriFS2Afdxuf1/s1600/meh5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfB9dp3vYg2IGvF9FhSu-QJ5ZQ-UrRdM1tiCSoMRwY3uX-Qw27rBJyEjzJajqyuhyphenhyphenwVCyFxDWc1C_X2hWKK081CORLjpnkHLUb4LM95DcI9w2Pzbbh9UmeFXCP9IQ2U9aeriFS2Afdxuf1/s200/meh5.jpg" width="200" /> </a> </div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Promedio de tiempo de ejecución</b></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Nótese que los tiempos de ejecución de cada subrutina son menores que las 2 imágenes anteriores, debido a que las dimensiones de esta imagen son menores que las pasadas.</span><b><span style="font-family: Arial,Helvetica,sans-serif;"> </span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpYMTOSAxdvDg90UeTOMzBviL5aE4cr8IYq3w1pd6GiX1NuM41Vehd5SU0eBGbRt8MODD_PmX0rTp9fiXig3gWErui31sx6mHhaMkmViFsUhmh9lz-hNDfJSX5iO870TzmdTXqzFwvdd7n/s1600/imagen3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpYMTOSAxdvDg90UeTOMzBviL5aE4cr8IYq3w1pd6GiX1NuM41Vehd5SU0eBGbRt8MODD_PmX0rTp9fiXig3gWErui31sx6mHhaMkmViFsUhmh9lz-hNDfJSX5iO870TzmdTXqzFwvdd7n/s400/imagen3.png" width="400" /></a></div>
<div style="text-align: center;">
<br />
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Liga a git: <a href="https://github.com/eddypre/VisionTriana/blob/master/Tarea1.py">https://github.com/eddypre/VisionTriana/blob/master/Tarea1.py</a></span></div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bueno, esto es todo para esta actividad. Cualquier duda o aclaración pueden dejarla en los comentarios.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
</div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-80762377648535396232013-02-04T19:34:00.003-08:002013-02-06T18:12:27.327-08:00Laboratorio 1 <div style="text-align: center;">
<div style="text-align: center;">
<span style="color: #660000;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Laboratorio 1 - <span style="font-size: x-large;">Escala de g<span style="font-size: x-large;">rises y umb<span style="font-size: x-large;">rales</span></span></span></span></span></span><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"> </span></span></span></span></span></span></span></span></span></div>
<div style="text-align: center;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;"><span style="font-size: x-large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><br />Hola<span style="font-size: small;">, </span>para esta primer <span style="font-size: small;">entrada <span style="font-size: small;">del laboratorio de Visión Computa<span style="font-size: small;">cional</span></span></span> se nos pidió realizar un programa que dad<span style="font-size: small;">a una imagen cualquiera<span style="font-size: small;">, obtener una cop<span style="font-size: small;">ia de la imagen a escala de grises, luego por medio de umb<span style="font-size: small;">rales, asignar pixeles, blanco, negro<span style="font-size: small;"> y gris (el mismo color<span style="font-size: small;">) a la imagen<span style="font-size: small;">.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;"><span style="font-size: x-large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Bien, di<span style="font-size: small;">cho esto<span style="font-size: small;">, voy a proceder a <span style="font-size: small;">explicarles el método que usé para convert<span style="font-size: small;">ir mi imagen a escala de g<span style="font-size: small;">rises (creo que t<span style="font-size: small;">odos usamos el mismo método</span>)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>. <span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Primeramente, obtuve de cada uno de los pixeles los valores de RGB, <span style="font-size: small;">luego realicé un promedio con esos 3 <span style="font-size: small;">valores. <span style="font-size: small;">Por ejemplo: </span></span></span></span></span></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Pixel1 = (65, <span style="font-size: small;">30,<span style="font-size: small;"> 14</span></span>)<span style="font-size: small;"><span style="font-size: small;">, <span style="font-size: small;">el promedio es <span style="font-size: small;">(65<span style="font-size: small;"> +</span> 30<span style="font-size: small;"> +</span> 1<span style="font-size: small;">4) / 3 = 36.33.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">Seguido de eso igual<span style="font-size: small;">é</span> <span style="font-size: small;">lo<span style="font-size: small;">s valores d<span style="font-size: small;">e RGB del pixel al promedio obtenido</span></span></span>, es decir: </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </div>
<span style="color: #660000;"><span style="font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span></div>
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">NuevoPixel = (36, 36, 36)</span></span><br />
<br />
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Algo así:</span></span><br />
<br />
<pre class="brush:py">for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
print tupla, "--", a,",",b,",",c
im.save('meh.jpg')
</pre>
<br />
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Luego por medio de la función putpixel formo la imagen con los nuevos valores de RGB de cada pixel.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibL59ZMfS42SUoQRAPGl7SwqRehtv5hyidzPvsfdWdki5R2T2fIf43vB6NMC5kA_mvwJnr6UgGw8NLt9m3kgeMOPpKSp1UPe2Ok8icnZTH1WxJ_zSROizBB9TCP9vXbfeuzqs68z20Xcuu/s1600/bla.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibL59ZMfS42SUoQRAPGl7SwqRehtv5hyidzPvsfdWdki5R2T2fIf43vB6NMC5kA_mvwJnr6UgGw8NLt9m3kgeMOPpKSp1UPe2Ok8icnZTH1WxJ_zSROizBB9TCP9vXbfeuzqs68z20Xcuu/s320/bla.jpg" width="320" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">La imagen anterior es la imagen original que uso para realizar esta práctica, cuando ejecuto mi programa primero me sale la imagen original, luego en terminal me pregunta lo que deseo hacer, me dice que presione 1 para realizar la función de escala de grises o que presione 2 para usar la función de umbrales.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Si elegimos la opción 1 se ejecutará la siguiente función (transformar):</span></span></div>
<br />
<pre class="brush:py">def transformar():
i = 0
x = 0
y = 0
im = Image.open("bla.jpg")
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
print tupla, "--", a,",",b,",",c
im.save('meh.jpg')
</pre>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Si elegimos la opción 2 se ejecutará la siguiente función (umbrales):</span></span><br />
<br />
<pre class="brush:py">#Funcion umbrales
#Se accede a ella presionando 2
def umbrales():
i = 0
x = 0
y = 0
umbInferior = 77
umbSuperior = 177
im = Image.open("bla.jpg")
for x in xrange(im.size[0]):
for y in xrange(im.size[1]):
pix = im.load()
tupla = pix[x, y]
a = tupla[0]
b = tupla[1]
c = tupla[2]
prom = int((a+b+c)/3)
if prom < umbInferior:
prom = 0
elif prom >= umbSuperior:
prom = 255
newTupla = (prom,prom,prom)
im.putpixel((x, y), newTupla)
print tupla, "--", a,",",b,",",c
im.save('meh2.jpg')
</pre>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Cuando ejecutamos la primera opción el resultado de la imagen es la siguiente:</span></span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4PbnSWzZR53JbmJirwsgzvDFCFOeZxWspSbU97niV6lcAF9AK3WRNBYLnxeopqleGX_1bij9GDjmm-br5j4aoPTRPEmD7k83BctPwVbyvwWSmKEa5-Nxnn7OusPc_QY2NSDDC9YoynNZs/s1600/meh.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4PbnSWzZR53JbmJirwsgzvDFCFOeZxWspSbU97niV6lcAF9AK3WRNBYLnxeopqleGX_1bij9GDjmm-br5j4aoPTRPEmD7k83BctPwVbyvwWSmKEa5-Nxnn7OusPc_QY2NSDDC9YoynNZs/s320/meh.jpg" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">La imagen<span style="font-size: small;"> </span>a a escala de grises, luego cuando ejecutamos la segunda opción el resultado de la imagen es la siguiente: </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqeZxOokw-39trx6oQbdYNjf7LGSkl04J0WQzjj3niZ8DHBAuDXZ2p3D_jcez0YF1BUibcxqcL3fkaydne5oh31-bZ7lnShcXfkNJXo5FTd_ZcUc8Rv66KuPFFjSVd6Vmr5jP7Ymk7yAj5/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqeZxOokw-39trx6oQbdYNjf7LGSkl04J0WQzjj3niZ8DHBAuDXZ2p3D_jcez0YF1BUibcxqcL3fkaydne5oh31-bZ7lnShcXfkNJXo5FTd_ZcUc8Rv66KuPFFjSVd6Vmr5jP7Ymk7yAj5/s320/meh2.jpg" width="320" /></a></div>
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">La imagen a blanco y negro con algunos pixeles en gris, los pixeles en gris son porque quedaron en medio de los umbrales superior e inferior que puse. Es decir, si el pixel resultaba menor al umbral inferior (85), lo pintaba en negro, si el pixel resultaba mayor al umbral superior (170) lo pintaba de blanco, y si quedaba entre los valores de los umbrales el pixel permanecia en el valor gris.</span></span><br />
<br />
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-size: large;">Jugando con los umbrales</span></b></span></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Bien, después de esto realicé algunas modificaciones a los valores de umbrales y pixeles para visualizar los cambios de las imagenes resultantes, en la siguiente imagen apliqué lo contrario, es decir, si el valor del pixel era menor al umbral inferior, al nuevo pixel le daba el valor de 255, y viceversa, de esa manera esperaba el resultado contrario (cambiar negros por blancos y blancos por negros).</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">El resultado es el siguiente:</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtvuvilE5x4mCWSlFIAc7u1mTG7yDX3-f687h0giFKs3pXgQUEgdHxPEQDnLwlmW8Hn-S4fZ-hxFhwzxDbGHFO-X-JdjCsVhlASxcefC9y_9jGVGO2Xc62M9LeK1ptOpuuhdJb3riOPumj/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtvuvilE5x4mCWSlFIAc7u1mTG7yDX3-f687h0giFKs3pXgQUEgdHxPEQDnLwlmW8Hn-S4fZ-hxFhwzxDbGHFO-X-JdjCsVhlASxcefC9y_9jGVGO2Xc62M9LeK1ptOpuuhdJb3riOPumj/s320/meh2.jpg" width="320" /></a></div>
<br />
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Luego cerré un poco más los valores de los umbrales para observar el efecto resultante, lo que yo esperaba (obvio) era menos valores de grises, y que se aumentaran los pixeles blancos y negros, esto debido a que ya habría menos cabida para los pixeles grises, ya que se cerraron más los umbrales.</span></span><br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">El resultado es el siguiente:</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_HHOiy7Zr-kDmBcn5xLmKzP_mcr2Jn0QPh34Iq67YKSFKQGjpIh4Ar3NnMKZuuH6DMucRKMovJ9O2aQBZGON0Tk6N7-uH2uyjaxZWjuoB-eHfczSKsbH8NJ6ouqygKIlYRiP7bZA2OUKv/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_HHOiy7Zr-kDmBcn5xLmKzP_mcr2Jn0QPh34Iq67YKSFKQGjpIh4Ar3NnMKZuuH6DMucRKMovJ9O2aQBZGON0Tk6N7-uH2uyjaxZWjuoB-eHfczSKsbH8NJ6ouqygKIlYRiP7bZA2OUKv/s320/meh2.jpg" width="320" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">El resultado fue el esperado, una imagen con un mayor número de pixeles negros y blancos que la umbralización normal (umbral inferior = 85, umbral superior 170).</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;"><br /></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Después de esto, abrí el rango de los umbrales, osea, le di más cabida a los pixeles grises, pasé de los valores 117 para los umbrales inferiores y 137 para los umbrales inferiores a un 77 y 177 para los umbrales inferiores y superiores respectivamente. </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;"><br /></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Y este fue el resultado (obviamente con un mayor número de pixeles grises que la imagen anterior, quedando con menos pixeles negros y blancos):</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRk9c5Ghi-_PKZAG9CgszIYUT41wm3LtlzDNCcEQLi0QkDZV1H5Osx_zw2b5hp8Bcl7Xiyd4q9mHs4o6_DpQYoKIlCjUmiHrTk673uz-qlrzMh5RKQU2cHoBeoQhs5hLdeVCdwnXNGLNPm/s1600/meh2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRk9c5Ghi-_PKZAG9CgszIYUT41wm3LtlzDNCcEQLi0QkDZV1H5Osx_zw2b5hp8Bcl7Xiyd4q9mHs4o6_DpQYoKIlCjUmiHrTk673uz-qlrzMh5RKQU2cHoBeoQhs5hLdeVCdwnXNGLNPm/s320/meh2.jpg" width="320" /></a></div>
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Bueno, ese fue todo mi trabajo para esta entrada 1 del laboratorio, la liga a mi git con el trabajo es la siguiente: <a href="https://github.com/eddypre/VisionTriana/blob/master/Laboratorio1">https://github.com/eddypre/VisionTriana/blob/master/Laboratorio1</a></span></span><br />
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Ahí mismo también pueden encontrar las versiones que fui realizando (son 3). Y aprovecho para comentarles que en ese mismo pool subiré todos mis avances de proyecto de esta materia.</span></span><br />
<br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Cualquier duda o aclaración pueden dejarla en comentarios.</span></span><br />
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif;">Saludos!</span></span><br />
<br />
<br />Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-90605843462230281112013-01-22T06:42:00.000-08:002013-01-22T07:32:10.254-08:00Visión Computacional (puntos extras) <div style="text-align: center;">
<b><span style="color: #660000; font-family: Arial, Helvetica, sans-serif; font-size: x-large;">Aplicaciones de la visión computacional </span></b></div>
<div style="text-align: center;">
<br /></div>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Hola, esta entrada trata sobre <b><i>detección de rostros en imágenes a color</i></b> y es para puntos extra en la materia de visión computacional.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">La detección de rostros humanos juega un rol importante en aplicaciones como videos de vigilancia, acceso a sistemas mediante la lectura de rostros, etc.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Basado en una nueva técnica de compensación de luz y tansformación no linear de color, existen métodos que detectan regiones de la piel sobre imágenes completas y después genera rostros candidatos basados en la disposición espacial de la piel.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span><span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><b>Algoritmo de detección de rostros.</b></span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><b><br /></b></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">El algoritmo de detección de rostros se compone de 2 módulos. 1) El primero es la localización de caras para encontrar rostros candidatos. 2) Detección de características faciales para la verificación y detección de rostros candidatos.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">El algoritmo primero estima y aplica una corrección al color basado en una técnica de compensación de luces. La edición/corrección de los componentes rojo/verde/azul son no linearmente transformados en el espacio de colores YCbCr.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Los pixeles del tono de piel son detectados usando un modelo elíptico de piel en el espacio transformado. El parámetro del elipse corresponde al contorno de la constante de distancia Mahalanobis bajo la suposición de distribución Gaussiana del color de tono de piel.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Los pixeles de tono de piel detectado son segmentados iterativamente usando varianza de color dentro de los componentes de colo conectados, los cuales son agrupados después entre los candidatos de rostros basados en ambos arreglos espaciales de estos componentes y la similitud de sus colores.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">El tamaño de pixeles de un rostro candidato puede variar desde 13x13 pixeles hasta cerca de tres cuartas partes de la imagen original.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">La característica del módulo de detección facial rechaza las regiones de los rostros de los candidatos que no contienen ninguna característica facial como ojos, boca y límites del rostro.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">El resultado es la detección facial encerrada en un elipse, con las características faciales, tales como la boca, nariz, ojos, dentro de tríangulos.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Como se muestra en la siguiente figura.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5XbEurjhuC7mTAXFnyZxbuf507a4FWOH4lLEbcMMuHNyYLuw4OgdnY3aTSwksBorFySgxwVQlzU7nx9vpqaF6BdHIplQjMU3dghbI2HOmL4lItPfNiZSv2FvmeEM_0ox7n9Ox4N15JAdc/s1600/Captura01.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5XbEurjhuC7mTAXFnyZxbuf507a4FWOH4lLEbcMMuHNyYLuw4OgdnY3aTSwksBorFySgxwVQlzU7nx9vpqaF6BdHIplQjMU3dghbI2HOmL4lItPfNiZSv2FvmeEM_0ox7n9Ox4N15JAdc/s640/Captura01.PNG" width="640" /></a></div>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br />La detección del tono de piel y la compensación de luces están totalmente ligadas, ya que para poder realizar una correcta detección es necesario tener un bue ambiente iluminado, la técnica usada para compensación de luces es llamada "reference white", y se trata de normalizar la apariencia de los colores, como se muestra en la siguiente figura.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhouwm0V-QQaN_38THL0WogpjlY3EuBLgjRzF591giQyrx_nf6lF2NDG2UNygTok7Z7kDuda80D36rwte6adnXsNDt-4SWbRigtm7bfXdbKysKp4UY4ycBy3vcsKpxBMzp6GpgjUCK-S5cm/s1600/Captura02.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhouwm0V-QQaN_38THL0WogpjlY3EuBLgjRzF591giQyrx_nf6lF2NDG2UNygTok7Z7kDuda80D36rwte6adnXsNDt-4SWbRigtm7bfXdbKysKp4UY4ycBy3vcsKpxBMzp6GpgjUCK-S5cm/s640/Captura02.PNG" width="640" /></a></div>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /><b>Conclusión</b><br /><br />La detección de rostros tiene una semejanza al procesamiento y detección de voz en cuanto a complejidad, pero sin duda son campos que están en constante mejoramiento, aunque pienso que siempre seguirán muy lejos de la perfección y detección exacta y precisa.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Este me parece un tema interesante para trabajar en el proyecto de esta materia.</span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;">Cualquier duda o aclaración pueden ponerla en comentarios. </span><br />
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"><br /></span>
<span style="color: #444444; font-family: Arial, Helvetica, sans-serif; text-align: justify;"> Saludos!</span>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-91622050590883540672012-11-12T14:04:00.002-08:002012-11-12T22:13:19.080-08:00Reporte Grupal<div style="text-align: center;">
<b><span style="color: #134f5c;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Reporte grupal</span></span></span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #444444;">Hola, esta entrada trata sobre el reporte grupal, el equipo para esta actividad está conformado por mi compañero Alejandro Avendaño<span style="color: black;"><span style="font-family: Arial;">, <span style="color: #444444;">Jonathan Alvarado</span></span></span> y yo (Carlos Triana), los ejercicios que teniamos que desarrollar para esta actividad son los siguientes:</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div dir="ltr" id="internal-source-marker_0.7759607031668311" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Formulen el sistema que quieren controlar en términos de espacio de estados.</span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">En la forma normal controlable.</span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">También en la forma normal observable.</span></span></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Utilizando los vectores y los valores propios, diagonalicen a un forma normal -Jordan</span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Las investigaciónes, desarrollos y cálculos realizados se encuentran en la siguiente liga (blog de mi compañero Alejandro Avendaño): <a href="http://autoycontrolave.blogspot.mx/2012/11/blog-post_12.html">http://autoycontrolave.blogspot.mx/2012/11/blog-post_12.html</a></span></span><br />
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><br /></span></span>
<br />
<div dir="ltr" id="internal-source-marker_0.7392018684517844" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Bibliografía:</span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="http://usuarios.multimania.es/automatica/temas/tema4/pags/ftec/ejemtransass.htm"><span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">http://usuarios.multimania.es/automatica/temas/tema4/pags/ftec/ejemtransass.htm</span></span></a></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><a href="http://www.scribd.com/doc/7110427/Espacio-de-Estados-Presentacion">http://www.scribd.com/doc/7110427/Espacio-de-Estados-Presentacion</a></span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="color: #444444;"><span style="background-color: transparent; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Saludos!</span></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
</div>
Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com0tag:blogger.com,1999:blog-1310697525469401982.post-4887919762760161042012-11-06T14:52:00.001-08:002012-11-06T14:55:57.425-08:00Puntos extras<div style="text-align: center;">
<span style="color: #660000;"><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-large;">Control estructural <span style="font-size: x-large;">por medio de sensores wireless y c</span>ómputo <span style="font-size: x-large;">i</span>ntegrado</span></span></b></span></div>
<br />
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">El origen del tema que escogí para esta entrada es el décimo tercero simposio anual internacional en materiales y estructuras inteligentes. Se llevó acabo en San Diego California en Febrero y Marzo del 2006.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">A grandes rasgos el contenido de la publicación trata sobre el campo de la ingeniería estructural (o de estructuras, en específico la ingeniería civil) apoyado por la ingeniería informática-electrónica para la investigación de sensores wireless (todavía no implementados en la ingeniería civil) de bajo costo para su uso en sistemas de monitoreo estructural.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">La finalidad de esta investigación e implementación es ahorrarse tanta labor y costos asociados a las instalaciones hechas con largas extensiones de cables coaxiales en los actuales sistemas de control de estructuras, los autores mencionan que esta tecnología es el futuro para los sensores de control de estructuras.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Bien, lo que este sistema propone es que los sensores wireless son diseñados para cumplir 3 tareas principales en el sistema de control: </span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">1 - Los sensores inalámbricos son responsables de la recolección de datos de las respuestas estructurales.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">2 - Los sensores inalámbricos son responsables del cálculo de las fuerzas de control.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">3 - También son responsables de emitir comandos a los actuadores.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">En la publicación se menciona que un prototipo de sistema "Wireless Structural Sensing and Control (WiSSCon)" fue presentado en el simposio.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Y para evaluar el desempeño de este prototipo se llevan acabo experimentos a media escala con 3 estructuras de acero en las que un amortiguador magnetoreológico está instalado. El funcionamiento del sistema de WiSSCon se ha demostrado que es efectivo y fiable.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Los autores y creadores de este sistema dicen que WiSSCon no es más que un prototipo diseñado para estar sensando y retroalimentando de información en "tiempo real" por wireless al sistema de control. También mencionan que la comunicación por wireless es usada para la retroalimentación de la respuesta estructural para así calcular soluciones de control basadas en la información que se envío.</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Para que les haga más sentido la transmisión de la información y cálculos realizados con la misma, dejo este gráfico que describe perfectamente el sistema (La imagen fue obtenida de la misma publicación: </span></span><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span data-ft="{"tn":"K"}" id=".reactRoot[1].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[1].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]."><a href="http://www-personal.umich.edu/%7Ejerlynch/papers/SPIE2006Control.pdf" id=".reactRoot[1].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]..[3]" rel="nofollow" target="_blank">http://www-personal.umich.edu/~jerlynch/papers/SPIE2006Control.pdf</a></span></span>)</span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_7BlPCNam5i_ToHzWpCTG8rYOtpGXS_P16Yt6-hqc8jYaruLC-v4w9Usw7vjxJBAdvRYxIicEcnuOXyBeOm-OiYHKZrWTnoKzit_6SAZ6mL6ZspizvypQBT0j3XyqUYsW4JU3Sbzfe2O/s1600/estr01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw_7BlPCNam5i_ToHzWpCTG8rYOtpGXS_P16Yt6-hqc8jYaruLC-v4w9Usw7vjxJBAdvRYxIicEcnuOXyBeOm-OiYHKZrWTnoKzit_6SAZ6mL6ZspizvypQBT0j3XyqUYsW4JU3Sbzfe2O/s640/estr01.png" width="640" /></a></div>
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">La arquitectura del hardware de la unidad de control por wireless utilizado para este prototipo (</span></span><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">WiSSCon</span></span>) es la siguiente (se puede apreciar la interacción del cómputo embebido):</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8OOM4rCv5N01d9jU_d9785SkrXXBoeCp6q3omvWsArGJw8bO4a6ceVRSOOcqW8q82zuK-xRo6QN41vic1dK8G_3meENg-hWMWO5s7MG04KtIpBPBvAkCYUxF6T1z34wIwODXHvqZYeTW7/s1600/extra01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8OOM4rCv5N01d9jU_d9785SkrXXBoeCp6q3omvWsArGJw8bO4a6ceVRSOOcqW8q82zuK-xRo6QN41vic1dK8G_3meENg-hWMWO5s7MG04KtIpBPBvAkCYUxF6T1z34wIwODXHvqZYeTW7/s640/extra01.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Y para los que creian que la clase de cómputo integrado no era tan importante, el módulo de control de señales (que se ilustra en la imagen siguiente) está hecho con mictrocontroladores ATmega128 (los usados en las tarjetas Arduino) y amplificadores operacionales, además de convertidores Digital-Analógicos.</span></span></div>
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYEwCiDYCvYYKfH4mKhcSkY5jfs4heihRMHonhqksRyImiycUzb4hyqsJDby5JuzxeH1ZyVZwq-s-J0M4WoVa2jPqGi6GbKFJmDAMKOokbXRMJlLMR0R-grZh2mMO777uSBcM84THLoifs/s1600/extras02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYEwCiDYCvYYKfH4mKhcSkY5jfs4heihRMHonhqksRyImiycUzb4hyqsJDby5JuzxeH1ZyVZwq-s-J0M4WoVa2jPqGi6GbKFJmDAMKOokbXRMJlLMR0R-grZh2mMO777uSBcM84THLoifs/s640/extras02.png" width="640" /></a></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Y así se ve en conjunto el módulo de control de la señal conectado al sensor wireless (básicamente es el aparato situado debajo de la estructura en la imagen 1, nótese la antena de emisión/recepción del módulo)</span></span></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE-S_WXNBL-11fc70MvvZkzj3C9Op4EBdNDsScQ7TN8cRDX3dcEI3se4_bnCqYxAi5z1kd8KmDTeCnjlrpB97pg1so9FqXSOprzM5W_kWYVakV-LDlOuBEOZAfHZcZ_H6nMJ-q5rumeCOr/s1600/extras03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE-S_WXNBL-11fc70MvvZkzj3C9Op4EBdNDsScQ7TN8cRDX3dcEI3se4_bnCqYxAi5z1kd8KmDTeCnjlrpB97pg1so9FqXSOprzM5W_kWYVakV-LDlOuBEOZAfHZcZ_H6nMJ-q5rumeCOr/s320/extras03.png" width="289" /></a></div>
<div style="text-align: justify;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<div style="text-align: center;">
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: large;"><b>Campos de aplicación y conclusiones</b></span> </span></span></div>
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">En la ingeniería civil, el mejoramiento a la respuesta (datos del movimiento de estructuras) de estructuras debido a la fuerte excitación dinámica es un reto difícil.</span></span><br />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Como ya antes mencioné, el sistema WiSSCon ha demostrado que es efectivo y fiable por lo cual no dudo en la futura aplicación de este y similares sistemas de control en las estructuras civiles.</span></span><br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Las personas que trabajaron en esta investigación son: Yang Wang, Andrew Swartz, Jerome P. Lynch, Kincho H. Law, Kung-Chun Lu, Chin-Hsiung Loh </span></span><br />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Y la liga de la publicación es:</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span data-ft="{"tn":"K"}" id=".reactRoot[49].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[49].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]."><a href="http://www-personal.umich.edu/%7Ejerlynch/papers/SPIE2006Control.pdf" id=".reactRoot[49].[1][2][1]{comment494812437220328_494817993886439}..[1]..[1]..[0].[0][2]..[3]" rel="nofollow" target="_blank">http://www-personal.umich.edu/~jerlynch/papers/SPIE2006Control.pdf</a></span></span></span><br />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Las palabras clave para encontrar la publicación aquí presentada fueron:</span></span><br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Keywords: <i><b>structural control, wireless communication, embedded computing</b></i><br /> </span></span><br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">La redacción total de este post fue hecha por mí, y </span></span><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">todas las imágenes fueron obtenidas de la misma publicación.</span></span><br />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">PD: La publicación no contenía gran información de los temas tratados en la materia, por tal motivo no puse ecuaciones, técnicas o conceptos estudiados durante el semestre. </span></span><br />
<br />
<br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;">Saludos!</span></span><br />
<span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><br />
<br />
<br />Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-35902427086664648672012-05-23T22:29:00.002-07:002012-05-23T22:31:55.229-07:00Sistemas Distribuidos (Clase y Laboratorio)<div style="font-family: Arial,Helvetica,sans-serif; text-align: center;">
<span style="color: #0b5394; font-size: x-large;">Semana 16 - Unión a VPN y clúster</span></div>
<div style="font-family: Arial,Helvetica,sans-serif;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Hola, esta última semana una parte del equipo de clúster nos juntamos con la idea de reunir a muchos nodos para formar un clúster más grande que el que ya habiamos hecho anteriormente. La idea era presentarlo en el salón el martes, para que luego los demás compañeros pudieran correr aplicaciones sobre él.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Bueno, solo pudimos reunir 7 máquinas, ya estando en el salón de clases los planes cambiaron a un mejor plano.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Decidimos unirnos al clúster que habían creado los compañeros Juan Carlos y Rafael. Los compañeros ofrecieron darnos acceso para unirnos a su servidor de VPN, para luego ser parte del clúster.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
El día de hoy algunos compañeros (los que reunimos las características del SO: "Ubuntu 10.04, 64 bits") logramos conectarnos al clúster mediante la VPN antes mencionada. </div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Lo que hicimos todos fue descargar los bash que creó el compañero Juan Carlos, los bash se encargaban de descargar algunos paquetes, copiar carpetas y archivos e instalar y configurar todo lo necesario.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Después de descargar y configurar todo, descargamos Ganglia para monitorear el clúster, también por medio de los bash.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Al final el compañero Rafael nos agregó al clúster y luego mediante el siguiente link (monitoreo) me di cuenta que ya estaba dentro del clúster.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<a href="http://node1.hopto.org/ganglia/">http://node1.hopto.org/ganglia/ </a></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
A continuación les dejo algunas impresiones de pantalla que saqué:</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Con esto me di cuenta la dirección ip que tenía asignada dentro del túnel de VPN, pueden notar como se creo una nueva conexión llamada "tun0-00" (mi ip es: 10.6.0.10)</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE11-9EXWjw8ZmWHWvW2DDz_ylJ7rqpMYkL33rYLbJaVC0P2dA_eHAfVI_xDK3VF7A7dFuwkwVcHr7Bxjhq1lBBLdlyz3SSSjjbNJOEg-4WMr6TmO3gMEbpNvyzZI7hexPwDU8vyJEGiyP/s1600/ss06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE11-9EXWjw8ZmWHWvW2DDz_ylJ7rqpMYkL33rYLbJaVC0P2dA_eHAfVI_xDK3VF7A7dFuwkwVcHr7Bxjhq1lBBLdlyz3SSSjjbNJOEg-4WMr6TmO3gMEbpNvyzZI7hexPwDU8vyJEGiyP/s640/ss06.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Aquí mediante la herramienta de monitoreo se puede observar que el estado del nodo 10.6.0.10 es UP, también se logra ver el estado de actividad de mi nodo. </div>
<div style="font-family: Arial,Helvetica,sans-serif;">
<br /></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKuFlUES45rkEwA7mgId14Dp8JJ2JtaNGK9iHYrfcq_fsTmS6trYytQGrey2O8z18lIZW90-mMURL65KtVJ_voX8KqENyh8JL6_RvWJqyI4UxZfrj1pbFk74mT_KEVBNU3h20AYWgWBvDP/s1600/ss02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKuFlUES45rkEwA7mgId14Dp8JJ2JtaNGK9iHYrfcq_fsTmS6trYytQGrey2O8z18lIZW90-mMURL65KtVJ_voX8KqENyh8JL6_RvWJqyI4UxZfrj1pbFk74mT_KEVBNU3h20AYWgWBvDP/s640/ss02.png" width="640" /></a></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Y aquí se puede ver la actividad de los nodos que se agregaron al clúster la última hora, los que tienen instalado el ubuntu en su HDD les aparece su nombre de equipo (por ejemplo el del compañero Juan Carlos: "en rojo"), los que estabamos corriendo el SO en la USB solo nos aparece la dirección ip del equipo (mi dirección es 10.6.0.10, soy el de amarillo :p).</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeP02ECIAmw5u8BRlhR3lXKTzJS2mZ0bKPXmO4P3Wf9S0pQaeq-BSFzce8PaN7Ynf-wvdWyWvLkAQBO5EZP1aF8AfN6JjahalzE0oYUDeDr21Vygusfqawkt-5d9v_eV652oqsnVY2mTCu/s1600/ss03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeP02ECIAmw5u8BRlhR3lXKTzJS2mZ0bKPXmO4P3Wf9S0pQaeq-BSFzce8PaN7Ynf-wvdWyWvLkAQBO5EZP1aF8AfN6JjahalzE0oYUDeDr21Vygusfqawkt-5d9v_eV652oqsnVY2mTCu/s640/ss03.png" width="640" /></a></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
No quise poner nada de esto en la wiki porque ya había puesto información sobre Ganglia y también buena parte de esto ya estaba posteado, además no fui yo quien inició la implementación de esta buena herramienta.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Quiero nominar a mis compañeros: <br />
<br />
<br />
<b>- Juan Carlos: </b><i>Por haber creado los .sh para descargar, instalar y configurar todo lo necesario.- </i><a href="http://jcecdps.blogspot.mx/2012/05/dps-class-contributions-week-15.html"><span style="font-family: Arial,Helvetica,sans-serif;">http://jcecdps.blogspot.mx/2012/05/dps-class-contributions-week-15.html</span></a><br />
<br />
<b>- Rafael: </b><i>Por haber implementado las herramientas de monitoreo y creado el servidor de VPN (junto con Juan).</i><br />
<b><br />-José: </b><i>Por habernos guiado a mí y otros 2 compañeros con la instalación y configuración para unirnos al clúster.</i></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Lo que yo espero para la tarde de mañana es que podamos correr aplicaciones con todos los nodos que nos agregamos hoy y después comparar los tiempos de ejecución de los programas con los tiempos que se hacian antes de que nos agregaramos nosotros.</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
Saludos!</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-31401423983119835032012-05-17T02:36:00.000-07:002012-05-17T02:56:55.899-07:00Sistemas Distribuidos (Clase y Lab)<div style="text-align: center;">
<span style="color: #3d85c6; font-size: x-large;"><span style="font-family: Georgia,"Times New Roman",serif;">Reporte 15 - Complemento sobre investigación de Grids</span></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<span style="background-color: white;">Para la semana 15 de Sistemas Distribuidos, decidí complementar en la wiki sobre el tema que investigó mi compañero Rodolfo de grids computacionales, ya que ya había leido con anterioridad sobre estos temas pero no los había puesto en la wiki.</span></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<span style="background-color: white;">También estuve trabajando con RMI pero con bastantes fallas debido a que nunca pude hacer la conexión entre computadoras, Java me tomaba una ip desconocida a la mia y nunca se pudo establecer conectividad, investigaré ese tema posteriormente más a detalle. La conexión solo la he logrado en mi misma máquina, pero así no tiene chiste, no se aprovecha las ventajas de RMI.</span></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<span style="background-color: white;">Bueno, mi corta aportación está en esta liga:</span></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<a href="http://elisa.dyndns-web.com/progra/Computacion%20Grid%28Malla%20de%20Ordenadores%29"><span style="background-color: white;"> http://elisa.dyndns-web.com/progra/Computacion%20Grid%28Malla%20de%20Ordenadores%29</span></a></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<b><span style="background-color: white;">Nominaciones:</span></b></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<ul>
<li><span style="background-color: white;"><i>Rodolfo</i>: Por la aportación de Grids computacionales en la wiki.</span></li>
</ul>
</div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<br /></div>
<div style="color: #666666; text-align: justify;">
<span style="background-color: white;">Saludos! </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com0tag:blogger.com,1999:blog-1310697525469401982.post-39598807114957500062012-05-10T00:49:00.000-07:002012-05-10T00:50:45.116-07:00Reporte 14 - Benchmark (Clase)<div style="text-align: center;">
<b><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="color: #666666;">Reporte 14 - Benchmark (Clase)</span></span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Anteriormente ya había hablado sobre benchmarks y pruebas que podemos realizarle a nuestro clúster, pero solo había comentado sobre teoría y algunas aplicaciones que nos podian servir al equipo clúster.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /><br />En esta ocasión para el reporte de la clase de esta semana instalé y corrí el System Profiler y Benchmark llamado "<u><b>HardInfo</b></u>".</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF1wyVDpFlx8AEgemLJt887-_KhhOabUdARv6ZLy9QbrTTurtgAUmaBJ3Okb5qvb_9POSEicYxHzE620Map5BLIro1oq3LpOcsT7_Mwk_dPt4sifGKv1_qjUnYD1TFC2N3dxo9b0S_7mC_/s1600/hardinfo01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="481" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF1wyVDpFlx8AEgemLJt887-_KhhOabUdARv6ZLy9QbrTTurtgAUmaBJ3Okb5qvb_9POSEicYxHzE620Map5BLIro1oq3LpOcsT7_Mwk_dPt4sifGKv1_qjUnYD1TFC2N3dxo9b0S_7mC_/s640/hardinfo01.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span> <span class="" id="result_box" lang="es" style="font-family: Arial,Helvetica,sans-serif;"><span class="hps"> </span></span><br />
<br />
<span class="" id="result_box" lang="es" style="font-family: Arial,Helvetica,sans-serif;"><span class="hps">HardInfo</span> <span class="hps">es una pequeña aplicación</span> <span class="hps">que muestra información</span> <span class="hps">sobre el hardware y</span> <span class="hps">sistema operativo.</span> </span><br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br />
El post de esta semana se encuentra en la siguiente liga:</div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<a href="http://elisa.dyndns-web.com/progra/Benchmark%20HardInfo">http://elisa.dyndns-web.com/progra/Benchmark%20HardInfo</a></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br />
<br />
Y para mayor información acerca de la aplicación HardInfo pueden visitar la página web del desarrollador: <a href="http://hardinfo.berlios.de/HomePage"> http://hardinfo.berlios.de/HomePage</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Saludos! </span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"></span></div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-28002320823523632012012-05-09T21:53:00.000-07:002012-05-09T22:53:12.954-07:00Reporte 14 (Laboratorio)<div style="text-align: center;">
<b style="font-family: Arial,Helvetica,sans-serif;"><span style="color: #073763; font-size: x-large;">Reporte 14 - Grid de computadoras (Laboratorio) </span></b></div>
<div style="text-align: center;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<div style="text-align: center;">
Hola, para el laboratorio de sistemas distribuidos esta semana investigué sobre grid de computadoras.</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.google.com.mx/url?source=imglanding&ct=img&q=http://techpdf.in/blog/wp-content/uploads/2011/06/distributed-computing2.jpg&sa=X&ei=qlWrT5O2O-Gq2QWcy4zQBg&ved=0CAkQ8wc&usg=AFQjCNEqa2T5h4kpWWHyDyIMHr1U3MdknA" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="http://www.google.com.mx/url?source=imglanding&ct=img&q=http://techpdf.in/blog/wp-content/uploads/2011/06/distributed-computing2.jpg&sa=X&ei=qlWrT5O2O-Gq2QWcy4zQBg&ved=0CAkQ8wc&usg=AFQjCNEqa2T5h4kpWWHyDyIMHr1U3MdknA" width="400" /></a></div>
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<br /></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span style="font-size: small;">Bueno vamos a empezar con la definición de este interesante concepto. Llamamos grid al sistema de computación distribuido que permite
compartir recursos no centrados geográficamente (sistemas centralizados) para resolver problemas
de gran escala. Los recursos compartidos pueden ser computadoras, supercomputadoras, PDA, móviles, software, datos, información ,etc.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">En las publicaciones donde investigué hacen una interesante analogía entre las redes de subestación eléctrica y las grids de cómputo, mencionan que en una red o grid de poder eléctrico distintas subestaciones, campos nucleares, sistemas de viento te pueden proveer del servicio de la electricidad eléctrica sin que tu lo sepas, es decir, tu solamente conectas el dispositivo que vayas a usar al tomacorriente esperando que a la empresa eléctrica a la que le estas pagando te de el servicio y puedas encender tu licuadora, refrigerador, computadora, etc.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Mencionan que en una grid de computadoras es algo similar. Tu puedes estar almacenando tus canciones o películas en servidores que ni siquiera son de tu propiedad (aunque pagues una renta de uso), inclusive están muy lejos de ti geográficamente pero ni siquiera te das cuenta. </span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Las grids computacionales se están usando para hacer posible la ejecución de proyectos que serían imposibles de realizar sin el poder computacional de la grid.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Hay un buen número de grid computacionales en todo el mundo.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="color: #666666;">Campos de aplicación de las grids</span></span></div>
<br />
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los biólogos emplean grids para simular miles de posibles drogas en sus computadoras con el objetivo de descubrir una molécula capaz de bloquear proteínas específicas de ciertas enfermedades.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los científicos de la tierra emplean grids para registrar los niveles de ozono, usando satélites, descargando diariamente cientos de GB de datos.<br /><br /> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los físicos de altas energías aplican grids en su búsqueda por una mejor comprensión del Universo, sobre la base de una grid de decenas de miles de computadoras de escritorio para almacenar y analizar los 10 Petabytes de datos producidos anualmente por el gran Colisionador de Hadrones. Miles de físicos en docenas de universidades alrededor del mundo quieren analizar esos datos.<br /><br /> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los ingenieros usan las grid para estudiar energías alternativas, tales como la fusión de energía.<br /><br /> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los artistas usan las grid para crear complejas animaciones para las películas.<br /><br /> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Los cientistas sociales estudian la vida de las abejas, el maquillaje que emplea nuestra sociedad y los secretos de la historia, mediante el uso de las grid </span></li>
</ul>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Como podemos apreciar, es casi ilimitada la cantidad de aplicaciones en que se puede aplicar la tecnología de grids computacionales.</span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Lo relevante de esto es que las grid computacionales no solo nos provee de recursos para manejar grandes cantidades de datos sino que también estos datos están distribuidos por todo el mundo, es decir, se pueden formar grupos de trabajo de investigadores, ingenieros y científicos sin tener la limitante de estar unidos geográficamente.</span><br />
<span style="font-size: small;"><br /></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Se puede decir que la base de esta idea de grid computacional es el compartimiento de recursos.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br /></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">La computación grid aspira a involucrar a todos en las ventajas de compartir recursos y en los beneficios de incrementar la eficiencia.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br /></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Las siguientes son algunas de las ventajas que te dan las grid computacionales:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br /></span><br />
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Las grid te dan acceso a pode computacional adicional.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Una grid también te puede dar acceso directo a software, computadoras y datos remotos.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Una grid te puede dar acceso a sensores remotos (lo que planean hacer algunos compañeros de domótica), telescopios y otros aparatos que no son de nuestra propiedad, pero los podemos rentar o los dueños pueden hacerlos de uso público.</span></li>
</ul>
</div>
<div style="text-align: center;">
<br />
<br />
<span style="color: #666666; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;">Confiabilidad y seguridad </span></span><br />
<br />
<div style="font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span style="font-size: small;">Después de todo lo mencionado anteriormente podría surgir la pregunta ¿A quiénes les confiaremos nuestros recursos computacionales?, es decir no conocemos a toda la gente que "tomará prestados" nuestros recursos.</span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Al pertenecer nosotros a una grid estamos expuestos a que se haga mal uso de nuestros recursos, por ejemplo, cuando tu quieras usar los recursos de tu computadora otro podría estar usándolos o podría ser al revés.</span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Es por eso que cuando alguien decide compartir sus recursos computacionales en la grid, normalmente pondrían condiciones para el uso de sus recursos, especificando límites temporales para que los recursos puedan ser utilizados y explicitando qué se puede hacer con ellos.</span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="color: #666666;">Acceso seguro</span></span></div>
<div style="text-align: center;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><span style="color: #666666;"><span style="color: black;">El acceso seguro a recursos compartidos es para mi el tema más desafiante hablando de la grid de computadoras, como he mencionado antes, tus recursos y datos están en juego cuando eres parte de la grid.</span></span> Es por eso que para asegurar el acceso seguro, los desarrolladores de grid necesitan manejar 3 cosas de máxima relevancia.</span></div>
<div style="text-align: justify;">
<ul>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Políticas de acceso: ¿Qué se comparte?, ¿A quién se le permite compartir?, ¿Cuándo se permite compartir?</span></li>
<li style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Autenticación: ¿Cómo identificas a un usuario o a un recurso?</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Autorización: Cómo determinar si una operación específica es consistente con las reglas.</span></li>
</ul>
</div>
</div>
<span style="font-size: small;"><br /></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"></span><br />
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span class="textnorm" style="font-size: small;">Las grid necesitan seguir la pista de esta
información, que puede cambiar día a día, de modo eficiente. Esto
implica que las grid deben ser extremadamente flexibles y contar con un
mecanismo de reportes fiable. Por ejemplo lo que he visto que es muy usado en equipos que en los cuales entran varias personas es que se tiene un sistema de acceso, el sistema te dice quienes estuvieron ocupando tales recursos y también te dicen los movimientos que hizo cada usuario, esto puede usarse para saber quienes han violado un protocolo de seguridad, etc (creo que esto también lo queriamos implementar en el equipo de clúster).</span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span class="textnorm"><br /></span><br />
<span class="textnorm"><br /></span><br />
<span class="textnorm"><br /></span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: center;">
<span class="textnorm"><span style="color: #666666; font-size: x-large;">Conexiones entre las grid</span></span><br />
<br />
<span style="font-size: small;"><br /></span><br />
<div style="text-align: justify;">
<span class="textnorm" style="font-size: small;"><span style="color: #666666;"><span style="color: black;"><span style="font-family: Arial,Helvetica,sans-serif;">Ya hemos comentado que las distancias geográficas entre los nodos de la grid no importa, ya que todos estos nodos son unidos por internet y los datos pueden ser compartidos por todo el mundo.</span></span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span class="textnorm" style="font-size: small;"><span style="color: #666666;"><span style="color: black;"><span style="font-family: Arial,Helvetica,sans-serif;">También hemos mencionado que para algún tipo de actividades es necesario manejar mucha cantidad de datos, aquí empieza el problema, cuando se está trabajando con una gran cantidad de datos obviamente la velocidad con que viajan estos datos también debe ser grande ya que de otra manera, se llevaría mucho tiempo en este tipo de actividades.</span></span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<div>
<span class="textnorm" style="font-size: small;">Algunos investigadores tienen necesidades
computacionales que hacen que incluso las conexiones más rápidas
parezcan lentas: algunos científicos incluso necesitan conectividad de
aún más alta velocidad, por sobre las decenas de gigabits por segundo
(Gbps); otros, necesitan latencias ultra bajas, de modo tal que no hayan
retardos cuando estén trabajando de modo remoto y en tiempo real con
sus colegas.</span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<span class="textnorm" style="font-size: small;">
</span><br />
<div>
<span class="textnorm" style="font-size: small;">Otros quieren asegurar que la entrega de datos a través de la grid
sea “justo a tiempo”, de modo tal que aquellos cálculos complejos que
requieren de comunicación constante entre los procesadores puedan ser
desarrollados. Para evitar los cuellos de botella en las comunicaciones,
los desarrolladores de grid también deben determinar las vías para
compensar fallas como errores de transmisión y fallas de los PC.</span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<span class="textnorm" style="font-size: small;">
</span><br />
<div>
<span class="textnorm" style="font-size: small;">Para satisfacer estos requerimientos críticos, se deben solucionar
muchos temas de las redes de alto rendimiento, incluyendo la
optimización de los Protocolos de Transporte y el desarrollo de
soluciones técnicas tales como el switching Ethernet de alto
rendimiento. </span></div>
<span class="textnorm"><span style="font-size: small;">
</span><span style="font-size: small;">
</span><span style="font-size: small;">
</span></span><br />
<div>
<span class="textnorm"><span style="font-size: small;">Es por esto que yo pienso que este tipo de técnicas y tecnologías de grid computacionales no se ha extendido en todo el mundo, porque se requieren de altas velocidades de transmisión de los datos, no todos los usuarios contamos con este tipo de conexiones, pero pienso que en un futuro si podría extenderse el uso de grids de computadoras.</span></span></div>
<span class="textnorm">
<span style="font-size: small;">
</span><span style="font-size: small;">
</span></span><br />
<div>
<span class="textnorm"><br /></span></div>
<span class="textnorm">
</span><br />
<div>
<span class="textnorm"><br /></span></div>
<span class="textnorm">
<div>
<br /></div>
</span><br />
<div style="text-align: center;">
<div style="text-align: center;">
<span class="textnorm"></span><br />
<div>
<span class="textnorm"><span style="color: #666666;"><span style="font-size: x-large;">Arquitectura</span></span></span><br />
<span class="textnorm" style="font-size: small;"><span style="color: #666666;"><br /></span></span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<span class="textnorm" style="font-size: small;">
</span><br />
<div style="text-align: justify;">
<div>
<span class="textnorm" style="font-size: small;"><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: black;">Voy a cerrar con este tema de grid de computaduras, platicando sobre la arquitectura de las grids, la arquitectura de una grid se refiere al modo en que la grid ha sido diseñada.</span></span></span></span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<span class="textnorm" style="font-size: small;">
</span><br />
<div>
<span class="textnorm" style="font-size: small;"><span class="textnorm">Usualmente se describe la arquitectura de grid en
términos de capas, donde cada capa cumple una función específica. Las
capas superiores están generalmente centradas en el usuario, mientras que las capas inferiores están más enfocadas en las computadoras y las redes: centradas en el hardware.</span></span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<span class="textnorm" style="font-size: small;">
</span><br />
<div>
<span class="textnorm" style="font-size: small;"><span class="textnorm">Las capas de una grid están distribuidas de la siguiente manera:</span></span></div>
<span class="textnorm" style="font-size: small;">
</span><br />
<div>
<ul type="disc"><span class="textnorm" style="font-size: small;"><span class="textnorm">
<li>La capa más baja es la red, ella conecta los recursos de grid.<br /><br />
</li>
<li>Sobre la capa de red descansa la capa de recursos:
los actuales recursos de grid, tales como computadores, sistemas de
almacenaje, catálogos de datos electrónicos, sensores y telescopios que
están conectados a la red.<br />
<br /> </li>
<li>La capa intermedia, el middleware,<b> </b>proporciona
las herramientas que permiten a los distintos elementos (servidores,
almacenaje, redes, etc) participar en una grid. Algunas veces la capa
intermedia es “el cerebro” tras la computación grid.<br />
<br /> </li>
<li>La capa que se ubica más arriba en la estructura es la de aplicaciones,
que incluye aplicaciones en ciencia, ingeniería, negocios, finanzas y
más, además de portales y grupos de herramientas de desarrollo cuya
función es apoyar a las mismas aplicaciones. Esta es la capa que “ven”
los usuarios de grid y con ella interactúan. La capa de aplicación
usualmente incluye un servicio de uso (serviceware), que desempeña
funciones de manejo de carácter general, tales como el rastreo de
quiénes proveen recursos grid y de quiénes los están usando.</li>
</span></span></ul>
<span class="textnorm" style="font-size: small;"><span class="textnorm">
</span><span class="textnorm"> </span><span style="color: #666666;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: black;"> </span></span> </span></span></div>
<span class="textnorm" style="font-size: small;">
</span></div>
</div>
<span style="font-size: small;"><br /></span><br />
<span class="textnorm" style="font-size: small;">
</span></div>
</div>
</div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Para finalizar les dejo la dirección de un blog donde hablan sobre temas y proyectos con grids:<a href="http://gridcast.web.cern.ch/Gridcast/"> <br />http://gridcast.web.cern.ch/Gridcast/ </a></span></div>
</div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Saludos!</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br />
<br /></div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-35960623380014016572012-05-02T22:46:00.004-07:002012-05-03T01:02:13.821-07:00Sistemas Distribuidos (Clase)<div style="text-align: center;">
<div style="color: #134f5c;">
<b><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;">Reporte 13 - Avances en clúster y RMI desde VPN</span></b></div>
<br />
<br />
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Hola que tal, esta semana estuve trabajando en programas RMI y también realicé aportaciones para el funcionamiento del clúster (especialmente en temas de VPN con hamachi), cabe señalar que del grupo que nos juntamos para realizar el clúster a mi no me funcionó, concluimos que fue por mi distribución de Ubuntu(11.10), ya que todos tienen 10.04 y pues a mi parecer si fue eso porque todos realizamos los mismos pasos.</span></span></span></div>
<div style="color: #444444; text-align: justify;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Se puede decir que para mi esta fue una semana de pruebas fallidas. Como ya había mencionado en entradas anteriores (fue la anterior), </span></span><span style="font-family: Arial,Helvetica,sans-serif;">trabajé</span><span style="font-family: Arial,Helvetica,sans-serif;"> con RMI junto con mis compañeros Esteban y Avendaño, desde computadoras remotas, todo iba bien, cada quien desde su máquina nos respondiamos los pings (nos encontrabamos cada quien en sus casas)</span></span><span style="color: #999999; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">, <span style="color: #444444;">pero al momento de yo correr el "servidor" y ellos el cliente y querer ejecutar un método de mi clase les decía que no podían hacer conexión con mi ip (dándoles una ip muy diferente a la mia) lo cual se me hizo extraño porque ellos si me respondian los pings.</span></span></span></span></div>
<div style="color: #444444; text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="color: #444444; text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">De esto no sacamos conclusiones más que podía ser una medida de seguridad de Hamachi (fue mi conclusión)</span></span></div>
<div style="color: #444444; text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Otra cosa en la que estuvimos trabajando fue en la creación del clúster desde nuestras casas gracias a túneles VPN, </span></span><span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">aquí también todo empezó bien con la creación de una red en Hamachi, luego todos nos unimos a la red y todos contestábamos los pings de todos. <br /><br />Incluso generamos las llaves de SSH copiamos las llaves generadas de todos los nodos(ellos no podian copiar mis llaves), después intentamos entrar por SSH todos contra todos, yo podia entrar a las computadoras de todos, pero ellos no podian copiar las llaves que yo había generado, probamos varias veces sin éxito, al final concluimos que podría ser la versión de mi Ubuntu, pero no estoy seguro.</span></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Al final mis compañeros (Jonathan y Avendaño) con los que estuve trabajando pudieron hacer funcionar el clúster (los 2 tienen Ubuntu 10.04) incluso corrieron un programa de fractales en python.</span></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Bueno, para ir descartando posibles fallas yo me cree una USB con Ubuntu 10.04, instalaré todos los paquetes necesarios para realizar la prueba nuevamente.</span></span><br />
<br />
<span style="color: #444444; font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Nomino a los compañeros Jonathan y Avendaño por crear el clúster de manera exitosa y correr aplicaciones en él (pronto me les uniré :p). </span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKUIj27XBkcbSVgFlKMhynYx6XkWdt79AoPefsYTYKYcz0cd9XIzQJoiakfm5rf3JORcIt8Mw99884M36MjXVXrGlU_0His-BM5hHrsI2j6OcOjDj62LY4IDkL9BjzhKI9xPhBdsGgeUlg/s1600/f.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKUIj27XBkcbSVgFlKMhynYx6XkWdt79AoPefsYTYKYcz0cd9XIzQJoiakfm5rf3JORcIt8Mw99884M36MjXVXrGlU_0His-BM5hHrsI2j6OcOjDj62LY4IDkL9BjzhKI9xPhBdsGgeUlg/s320/f.gif" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="font-size: small;">Saludos! </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #444444;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><span style="font-size: small;">,</span></span></span><b style="color: #999999;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;"><br /></span></b></div>
</div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-5049745413296378152012-05-02T20:31:00.000-07:002012-05-03T00:43:36.070-07:00Sistemas Distribuidos (Laboratorio)<div style="text-align: center;">
<b style="color: #0b5394;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-large;">Reporte 13 - Benchmark</span></b><br />
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Hola que tal, hoy platicando con un amigo sobre el clúster mencionamos que sería bueno poder medir las capacidades de ejecución de cada nodo o computadora que componía el clúster, ya entrado en el tema decidí investigar sobre aplicaciones o programas que pudieran realizar esta función; encontré conceptos interesantes relacionados a este tema.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b><i>En esta entrada hablaré sobre Benchmarks. </i></b></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Un <b style="font-weight: normal;">Benchmark</b>, es un programa que mide las prestaciones de una computadora, o de una
parte de la misma. Estos programas no solo pueden ayudarnos
en la comparación de diferentes sistemas sino que además son
capaces de evaluar las prestaciones de un equipo con
diferentes configuraciones de Software
y Hardware.
Los benchmarks son pruebas para medir el rendimiento y poder
verificar que el hardware funciona de forma óptima
o para comparar distintas configuraciones. </span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Se
trata de programas que se instalan de la misma forma que
una aplicación clásica. En la mayoría de los
casos, el benchmark inicia una aplicación o
conjunto de aplicaciones (ofimática, rendimiento 3D, cálculo científico, etc.) y
mide el tiempo
necesario para ejecutar una tarea. Los benchmarks 3D no
miden el tiempo de ejecución sino el número
de imágenes mostradas por segundo
durante la escena y calculan el promedio. </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Pero como menciono arriba existen distintos tipos de tests o pruebas Benchmark. </span><br />
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;">Cada test o prueba
Benchmark realiza un trabajo diferente. Algunos de estos nos indican lo rápido que es una computadora generando documentos, otros indican lo veloz que es
en los gráficos y rellenos de pantalla,
otros determinan la velocidad en operaciones matemáticas. Algunos hacen una
mezcla de todos estos test. Para obtener resultados que
nos sean útiles deberemos utilizar Benchmarks que
reflejen el uso que le daremos al equipo.</span><br />
<br />
<br />
<i>Existen dos niveles de Benchmark: componentes y
sistemas<span style="font-size: small;">:</span></i><br />
<br />
<ul>
<li><b style="color: #999999;"><i><span style="font-size: small;"><span style="color: #666666;">Componentes <br /><br /> </span></span></i></b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />Evalúan únicamente partes
específicas de una computadora, como por ejemplo
el procesador, el disco
duro, la tarjeta gráfica, etc.
Serán por tanto útiles a la hora de
seleccionar componentes específicos para un
determinado sistema.<br /><br /> </span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i style="color: #666666;"><b>Sistema </b></i><br /><br /><br />Evalúan el rendimiento global del
sistema, miden las prestaciones del procesador, memoria</span><span style="font-family: Arial,Helvetica,sans-serif;">, vídeo, </span>disco duro<span style="font-family: Arial,Helvetica,sans-serif;">, etc.,
trabajando conjuntamente en la computadora. Este tipo de
pruebas permiten comparar sistemas diferentes. Responde a
cuestiones como ¿Este equipo es más
rápido que el equipo? o ¿Puede mi
aplicación ejecutarse mas rápidamente en el
caso de aumentar la velocidad del procesador, o esta
limitada por otros subsistemas?<br /><br />Estos
Benchmark miden prestaciones globales del
sistema.</span></span></li>
</ul>
<br />
Bueno, apartir de estos conceptos se podrían sacar conclusiones sobre la utilidad de estas pruebas Benchmark, pero de igual manera mencionaré por qué estás pruebas son necesarias:<br />
<div style="font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<ul style="font-family: Arial,Helvetica,sans-serif;">
<li><span style="font-size: small;">Adecuar apropiados estándares de
rendimiento que tomen en cuenta las diferentes
características del software de 32-bits y las
nuevas posibilidades de multitarea, video
y 3D que las viejas pruebas no tienen en
cuenta.</span></li>
</ul>
<div style="font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;">
</span></div>
<ul style="font-family: Arial,Helvetica,sans-serif;">
<li><span style="font-size: small;">Una medida más precisa de las
diferencias de rendimiento relativo entre dos computadoras
distintas, permitiéndole aumentar la vida
útil de una PC con la vista puesta en el
futuro.</span></li>
</ul>
<div style="font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;">
</span></div>
<ul style="font-family: Arial,Helvetica,sans-serif;">
<li><span style="font-size: small;">Ayudarle a prevenir que tenga que
aumentar su inversión antes de tiempo,
mostrándole la verdadera diferencia de rendimiento
entre dos sistemas. </span></li>
</ul>
<br />
En una página de IBM encontré información sobre el LINPACK benchmark, ellos realizaron una prueba o test a si Linux clúster, los pasos para la instalación y la ejecución se detallan en la siguiente liga:<br />
<br />
<a href="http://www.ibm.com/developerworks/linux/library/l-cluster2/">http://www.ibm.com/developerworks/linux/library/l-cluster2/</a><br />
<br />
El benchmark Linpack puede conseguirse en versión Fortran, C y como un applet de Java.<br />
<br />
<br />
<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;"><i><b><span style="color: #666666;">LINPACK Benchmark </span></b></i></span></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://ssl.gstatic.com/android/market/com.greenecomputing.linpack/hi-256-2-30a53d126da5c954164f7cbb5a347dcfc4f70ccb" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://ssl.gstatic.com/android/market/com.greenecomputing.linpack/hi-256-2-30a53d126da5c954164f7cbb5a347dcfc4f70ccb" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<br />
Como tema de interés también descubrí que existe LINPACK para
Android, funciona exactamente para lo mismo, con LINPACK for Android tu
puedes obtener mediciones de las prestaciones de tu teléfono móvil con
Android, también aplica para tabletas.<br />
<br />
Ya obtenidas las mediciones de tu dispositivo, también tiene la opción de compararlas con otros equipos. <br />
<br />
El benchmark Linpack fue desarrollado en el Argone National Laboratory por Jack Dongarra en 1976, y es uno de los más usados en sistemas científicos y de ingeniería.<br />
<br />
<div style="text-align: justify;">
Su uso como benchmark fue accidental, ya que originalmente fue una
extensión del programa Linpack cuyo propósito era resolver sistemas de
ecuaciones que otorgaba el tiempo de ejecución del programa en 23
máquinas distintas. <br />
Luego fueron agregándose cada vez mayor cantidad de
máquinas.
<br />
Hoy en día, el programa Linpack ha sido reemplazado por el paquete Lapack, el cual hace un uso mucho mejor de las características de la arquitectura RISC (en esencia, sus técnicas algorítmicas fueron modificadas para que pase menor tiempo moviendo datos).</div>
<br />
<br />
Aquí les dejo un video sobre un Linpack en un móvil con Android:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/cLNjHyAi8BI?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
<br />
Pueden encontrar más información y videos sobre este benchmark en el siguiente link:<br />
<br />
<a href="http://www.greenecomputing.com/">http://www.greenecomputing.com/</a><br />
<br />
Aquí les dejo una imágen con el benchmark LINPACK for Android en ejecución: <br />
<br />
<br />
<div style="text-align: center;">
<br /></div>
<ul>
</ul>
</div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif; text-align: center;">
<i style="color: #444444;"><b><span style="font-size: x-small;">(Linpack for Android)</span></b></i></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHxxmhEPZqhfzFpIJdp62fCLnD7qd0Th-HaiWcJNKySxiXXVWefCUzEnaplJ_eheHh_FN2wLe3kA2lytonQYpJYke5LuKnirpZXyKZwhtmVj5FVF5HBS75vFdW7zqyuu0Gbal9R1X-VZwc/s1600/linpack_android_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHxxmhEPZqhfzFpIJdp62fCLnD7qd0Th-HaiWcJNKySxiXXVWefCUzEnaplJ_eheHh_FN2wLe3kA2lytonQYpJYke5LuKnirpZXyKZwhtmVj5FVF5HBS75vFdW7zqyuu0Gbal9R1X-VZwc/s400/linpack_android_2.jpg" width="240" /></a></div>
<br />
<br />
<br /></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;">Saludos! </span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
<div style="color: black; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
</div>
</div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1tag:blogger.com,1999:blog-1310697525469401982.post-44477822821152056112012-04-26T22:16:00.005-07:002012-04-30T00:51:56.919-07:00Sistemas Distribuidos (Laboratorio)<div style="text-align: center;">
<span style="color: #134f5c; font-size: x-large;"><b style="font-family: Arial,Helvetica,sans-serif;">Reporte 12 - Seguridad de la información en el clúster</b></span><br />
<span style="color: #134f5c; font-size: x-large;"><b style="font-family: Arial,Helvetica,sans-serif;"><br /></b></span><br />
<div style="color: #444444; text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">En
esta entrada para laboratorio mencionaré buenas prácticas que se
acostumbran hacer en un clúster para mantener la seguridad y
confidencialidad.</span></span></span></div>
<div style="text-align: justify;">
<span style="color: #134f5c; font-size: small;"><span style="color: #444444; font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Sería
bueno que la información de nuestro clúster sea conocida y accedida
solamente por aquellos que estén debidamente autorizados (confidencialidad).</span></span></span><br />
<br />
<span style="color: #134f5c; font-size: small;"><span style="color: #444444; font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">También la información solo puede ser modificada, creada o eliminada por quienes estén autorizados (integración), para este tipo de seguridad, yo recomendaría las técnicas y procedimientos que se aplican en algunas empresas como Alestra, para administrar equipos de red (routers, switches, etc) ellos primero tienen que autenticarse con user y password.</span></span></span><br />
<br />
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="font-size: large;"><i style="color: black;"><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Hacen esto por medio de TACACS</span></span></b></i></span><br /><br /><br /><span style="color: #444444;">TACACS (Terminal Access Controller Access Control System) es un protocolo de autenticación remota, propietario de cisco, que se usa para comunicarse con un servidor de autenticación comúnmente usado en redes Unix.
TACACS permite a un servidor de acceso remoto comunicarse con un
servidor de autenticación para determinar si el usuario tiene acceso a
la red.<br /><br /><br /></span></span><br />
<br /></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.cisco.com/image/gif/paws/70992/tacacs-radius-config3.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="http://www.cisco.com/image/gif/paws/70992/tacacs-radius-config3.gif" width="320" /></a></div>
<br />
<br /><br /></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="color: #444444; font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Cuando
el administrador de la empresa quiere tener acceso a un router, primero
se le pide un user y un password, luego estos datos proporcionados por
el administrador van y se comparan a este servidor TACACS, luego si tus
datos están registrados en el servidor y todo coincide tendrás acceso al
equipo, de otra manera es "imposible" entrar a cualquier equipo</span></span></span><span style="font-size: small;"><span style="color: #444444;">.</span></span></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="color: #444444;"><br /></span></span></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="color: #444444;">No digo que utilicemos esta herramienta en específico porque es propietario de Cisco, por lo tanto es de paga, pero podemos hacer uso de algo similar, incluso se me hace sencillo programarlo, con algo de Mysql debe quedar rápido.</span></span></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="color: #444444;"><br /></span></span></div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><span style="color: #444444;">Por otro lado, los sistemas que albergan datos e información deben garantizar disponibilidad cuando se requiera por quienes tienen los privilegios.<br /></span></span><br />
<br />
<span style="font-size: large;"><span style="color: #444444;"><i style="color: black;"><b>Buenas prácticas en seguridad dentro de la red</b></i></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.neckdiagrams.com/sites/default/files/upload/version-history-1.8/bugfix-100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://indsol.com.mx/imagenes/Autenticacion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<ul>
<a href="http://www.lifeoftech.net/wp-content/uploads/2009/03/ssh-image.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.lifeoftech.net/wp-content/uploads/2009/03/ssh-image.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a>
<li><span style="font-size: small;"><span style="color: #444444;"><span style="color: #444444;"><span style="background-color: white;"><i><b>Mantener servicios y sistemas actualizados</b></i>, en cuanto a parches y bug fixes, en este aspecto yo considero que nosotros estamos bien, porque todos tendremos la misma versión de SO además que es la LTS.<br /><br /><br /><br /></span></span></span></span><div style="text-align: center;">
<a href="http://www.neckdiagrams.com/sites/default/files/upload/version-history-1.8/bugfix-100.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.neckdiagrams.com/sites/default/files/upload/version-history-1.8/bugfix-100.png" /></a></div>
<span style="font-size: small;"><span style="color: #444444;"><span style="color: #444444;"><span style="background-color: white;"><br /><br /><br /><br /></span></span></span></span></li>
<li><span style="font-size: small;"><span style="color: #444444;"><i><b>Definir y emplear puntos y procedimientos de acceso</b></i> (mecanismos de autenticación), aquí considero buena opción realizar un simulador de un servidor TACACS donde cada nodo cuente con su user y password guardados en el master, luego cuando queramos entrar al clúster, que nos pida autenticarnos y nuestros datos se comparen con los guardados en el master, de esta manera una persona no autorizada no podría entrar a nuestro clúster.<br /><br /><br /><br /><br /></span></span><div style="text-align: center;">
<a href="http://indsol.com.mx/imagenes/Autenticacion.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="http://indsol.com.mx/imagenes/Autenticacion.jpg" width="200" /></a></div>
<span style="font-size: small;"><span style="color: #444444;"><br /><br /><br /><br /></span></span></li>
<li><span style="font-size: small;"><span style="color: #444444;"><i><b>Normar y controlar el acceso</b></i> a las instalaciones físicas de los sistemas. <br />Para este punto yo creo que es más aplicable a empresas donde si requieren de un nivel de seguridad máximo, donde su información si es muy importante.<br />Es bien sabido y he escuchado de muchos expertos que si no tienes una seguridad física de tus equipos, entonces no sirve de nada tu seguridad "virtual", incluso me han platicado de equipos cisco con candado físico, creo yo para proteger puertos.</span></span><div style="text-align: center;">
<a href="http://www.networksecure.com.sv/images/autenticacion_clip_image002.jpg" style="margin-left: 1em; margin-right: 1em;"><br /><br /><br /><br /><br /><br /><img border="0" height="107" src="http://www.networksecure.com.sv/images/autenticacion_clip_image002.jpg" width="200" /><br /><br /><br /></a></div>
<span style="font-size: small;"><span style="color: #444444;"><br /></span></span></li>
<li><span style="font-size: small;"><span style="color: #444444;"><i><b>Implementar sistemas de respaldo.</b></i> La mayoría de las empresas de IT cuentan con sistemas de respaldo, donde cada moviemiento de información se va actualizando en un disco duro.<br />En este tipo de sistemas, así como en los sistemas de redundancia (equipos secundarios que entran en acción cuando el principal falla), es muy importante que se verifique periódicamente su buen funcionamiento.<br /><br />Actualmente está de moda el concepto de "la nube", incluso es una opción para respaldar la información del clúster, pero yo no la considero como una buena opción ya que dependes del servicio de alguien que ni siquiera le pagas para que te aloje tus datos, por lo tanto no te garantiza confiabilidad y disponibilidad. Peor aún dependes de una conexión a internet que debe ser muy segura y poco intermitente, a los proveedores de internet si les pagas, pero igual nunca garantizan confiabilidad.<br /><br />Yo considero mejor opción un servidor de respaldo propio, que funcioné con la conexión local, por si el internet llega a fallar, tomando en cuenta que nuestro clúster estará dentro de un mismo salón.<br /><br /><br /><br /><br /></span></span><div style="text-align: center;">
<a href="http://www.compuexpress.com.mx/2011/wp-content/uploads/2011/08/sistemas-de-replicamiento1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="http://www.compuexpress.com.mx/2011/wp-content/uploads/2011/08/sistemas-de-replicamiento1.jpg" width="200" /></a></div>
<span style="font-size: small;"><span style="color: #444444;"><br /><br /><br /></span></span></li>
<li style="text-align: left;"><div style="text-align: justify;">
<span style="font-size: small;"><span style="color: #444444;"><b><i>Cifrar o proteger con contraseñas los datos</i></b> e información importante del clúster. Para eso nosotros estamos trabajando con SSH, con SSH estamos habilitando el establecimiento de conexiones completamente cifradas.</span></span><br />
<br /><br /><br />
<br /></div>
</li>
</ul>
</div>
<div style="color: #666666; font-family: Arial,Helvetica,sans-serif;">
</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.protegetuinformacion.com/imgs/temas_interes/2/tema_21.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="http://www.protegetuinformacion.com/imgs/temas_interes/2/tema_21.gif" width="200" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.lifeoftech.net/wp-content/uploads/2009/03/ssh-image.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://www.lifeoftech.net/wp-content/uploads/2009/03/ssh-image.png" width="158" /></a></div>
<br />
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #134f5c; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esperemos que nos quede tiempo para implementar estas medidas de seguridad que en un futuro serán necesarias, cuando quede listo nuestro clúster.</span></span></span></span><br />
<br />
<span style="color: #134f5c; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Saludos a todos! </span></span></span></span><br />
<br />
<br />
<span style="color: #134f5c; font-size: x-large;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span><b style="font-family: Arial,Helvetica,sans-serif;"><br /></b></span></div>
</div>Eduardo Trianahttp://www.blogger.com/profile/16705524304274710100noreply@blogger.com1