<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog XYOX &#187; Inteligencia Artificial</title>
	<atom:link href="http://xyox.info/tags/inteligencia-artificial/feed/" rel="self" type="application/rss+xml" />
	<link>http://xyox.info</link>
	<description>Blog personal de XYOX, Web y No Web</description>
	<lastBuildDate>Wed, 14 Sep 2011 00:41:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Detección de rectas a través la transformada de Hough implementación en PHP</title>
		<link>http://xyox.info/2009/10/14/deteccion-de-rectas-a-traves-la-transformada-de-hough-implementacion-en-php/</link>
		<comments>http://xyox.info/2009/10/14/deteccion-de-rectas-a-traves-la-transformada-de-hough-implementacion-en-php/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 02:32:47 +0000</pubDate>
		<dc:creator>XYOX</dc:creator>
				<category><![CDATA[scripts]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[deteccion]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[rectas]]></category>
		<category><![CDATA[transformada hough]]></category>

		<guid isPermaLink="false">http://xyox.info/?p=376</guid>
		<description><![CDATA[Bueeeno este fue un trabajo que presente en la universidad en Inteligencia Artificial, con respecto al tema en internet la gran parte de informacion esta en ingles, y tampoco hay la implementacion en PHP... asi que aqui publico el trabajito que hice El objetivo de esto es simple, necesitamos reconocer formas a partir de simples [...]]]></description>
			<content:encoded><![CDATA[<p>Bueeeno este fue un trabajo que presente en la universidad en Inteligencia Artificial, con respecto al tema en internet la gran parte de informacion esta en ingles, y tampoco hay la implementacion en PHP... asi que aqui publico el trabajito que hice <img src='http://xyox.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p style="text-align: center;"><img class="aligncenter" title="Deteccion de rectas con la transformada de Hough" src="http://img115.imageshack.us/img115/3213/deteccionderectas.png" alt="" width="503" height="156" /></p>
<p>El objetivo de esto es simple, necesitamos reconocer formas a partir de<br />
simples líneas, cuadrados, rectángulos, triángulos y hasta círculos. Esto es un  reto para los métodos de inteligencia artificial, desde hace muchos años estos  métodos ya estaban en teoría desarrollados pero por las limitaciones de los  computadores, velocidad de procesamiento, memoria entre otras cosas era  muy pesado o poco probable desarrollar exitosamente estas técnicas.</p>
<p><span id="more-376"></span><strong>Transformada de Hough</strong></p>
<p>La transformada de Hough consiste en permitir descubrir las formas en una<br />
imagen. Se basa en transformar puntos de la imagen en un espacio de<br />
parámetros. La idea es encontrar rectas, como se menciono en teoría se<br />
pueden encontrar varias formas, pero el costo computacional es elevado.</p>
<p>La aplicación mas simple de la transforma de hough es para la detección de<br />
rectas, lo primero es tener una imagen binarizada, resultado de la detección<br />
de bordes. Para cada punto x, y de la imagen que estemos utilizando pasan<br />
infinitas rectas de la forma: y=ax+b, la ecuación de la recta. Luego cada<br />
punto x, y vota para cada pareja de puntos que satisface<strong> b=y-ax</strong>.</p>
<p>El algoritmo tiene que recorrer todos los puntos x, y, y para cada uno votar<br />
en el espacio de parámetros m, b o también llamado acumulador. Luego la<br />
pareja m, b con más votos o el máximo del acumulador da la ecuación de la<br />
recta.</p>
<p>Hasta aquí hemos llegado de manera sencilla con nuestro algoritmo, pero<br />
existe un problema, los valores de m tienden al infinito, por lo que<br />
almacenarlos y graficarlos será un impedimento para el uso de la<br />
transformada.</p>
<p>La solución planteada es la siguiente, si bien y = ax + b, se dice que toda<br />
ecuación puede ser representada en senos y cósenos es así que la ecuación de la recta de la forma y = ax + b, puede ser representada como:</p>
<p style="text-align: center;"><strong>p = xcos(θ) + ysen(θ)</strong></p>
<p>Esta es la llamada ecuación en la forma normal de la recta, donde p es la<br />
distancia de la recta al origen y θ es el ángulo entre la perpendicular y el eje  x, de esta forma son menos los puntos que hay que recorrer y por lo tanto más rápido es el algoritmo.</p>
<p>Los límites de estos están dados por las siguientes condiciones, θ varia entre 0 y 180 ya que a partir de 180 hasta 360 grados se vuelven a cruzar las curvas y p varia en la diagonal de la imagen es decir la hipotenusa con respecto a los lados de la imagen original.</p>
<p><strong>Implementación en el lenguaje PHP</strong></p>
<p>Si bien PHP esta orientado para el desarrollo de páginas dinámicas para entorno Web, eso no le quita potencialidad a la hora de usarlo como lenguaje de desarrollo para algoritmos complejos, ya que la gran facilidad que nos brinda en la manipulación de los tipos de datos lo hacen flexible a estas<br />
situaciones.</p>
<p>PHP usa la librería GD para manipulación de imágenes, los pasos que<br />
seguiremos en la implementación son los siguientes:</p>
<ul>
<li>Implementación de un frontend simple</li>
<li> Detección de bordes, aplicando el filtro Sobel.</li>
<li> Binarizacion de las líneas en contraste con el fondo.</li>
<li> Implementación del acumulador.</li>
<li> Graficar el acumulador en una nueva imagen.</li>
</ul>
<p>La interfaz será sencilla, constara de un formulario base donde podamos subir una imagen y cajas de entrada para la personalización del método a emplear:</p>
<p style="text-align: center;"><img class="aligncenter" title="frontend transformada de hough" src="http://img260.imageshack.us/img260/2664/ia3.png" alt="" width="457" height="446" /></p>
<p>Al momento de subir la imagen, la convertiremos dinámicamente al formato PNG de acuerdo a su actual extensión</p>
<pre class="php"><span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$ext</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'jpeg'</span>:
<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'jpg'</span>: <span style="color: #0000ff;">$imEntrada</span> = imagecreatefromjpeg<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$archivo</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tmp_name'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">break</span>;
<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'gif'</span>: <span style="color: #0000ff;">$imEntrada</span> = imagecreatefromgif<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$archivo</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tmp_name'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">break</span>;
<span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'png'</span>: <span style="color: #0000ff;">$imEntrada</span> = imagecreatefromgif<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$archivo</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tmp_name'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">break</span>;
<span style="color: #66cc66;">&#125;</span>
imagepng<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$imEntrada</span>,<span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">IMG_ENTADA</span><span style="color: #66cc66;">&#41;</span>;</pre>
<p>Donde this->IMG_ENTADA es el nombre de entrada que definimos previamente junto con el nombre de salida de las imágenes</p>
<pre class="php"><span style="color: #0000ff;">$tratamiento</span> = <span style="color: #000000; font-weight: bold;">new</span> TratamientoImagen<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$tratamiento</span>-&gt;<span style="color: #006600;">IMG_ENTADA</span> = <span style="color: #ff0000;">&quot;entrada.png&quot;</span>;
<span style="color: #0000ff;">$tratamiento</span>-&gt;<span style="color: #006600;">IMG_SALIDA</span> = <span style="color: #ff0000;">&quot;salida.png&quot;</span>;</pre>
<p>Necesitamos detectar los bordes de la imagen, en este resumen no incluiré la forma como se desarrollara la misma, en el proyecto presentado se uso el Filtro Sobel</p>
<p style="text-align: center;"><img class="aligncenter" title="sobel - Blog XYOX" src="http://img122.imageshack.us/img122/2664/ia3.png" alt="" width="421" height="200" /></p>
<p>Ahora podemos aplicar la transformada de Hough:</p>
<pre class="php"><span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$y</span>=<span style="color: #cc66cc;">0</span>; <span style="color: #0000ff;">$y</span>&lt;<span style="color: #0000ff;">$alto</span>; <span style="color: #0000ff;">$y</span>++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$x</span>=<span style="color: #cc66cc;">0</span>; <span style="color: #0000ff;">$x</span>&lt;<span style="color: #0000ff;">$ancho</span>; <span style="color: #0000ff;">$x</span>++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$matrImag</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$y</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$x</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
           <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$theta</span>=<span style="color: #cc66cc;">0</span>; <span style="color: #0000ff;">$theta</span>&lt;<span style="color: #0000ff;">$maximoTheta</span>; <span style="color: #0000ff;">$theta</span>+=<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #0000ff;">$r</span> = <span style="color: #0000ff;">$x</span> * <a href="http://www.php.net/cos"><span style="color: #000066;">cos</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/deg2rad"><span style="color: #000066;">deg2rad</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$theta</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #0000ff;">$y</span> * <a href="http://www.php.net/sin"><span style="color: #000066;">sin</span></a><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/deg2rad"><span style="color: #000066;">deg2rad</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$theta</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!<a href="http://www.php.net/isset"><span style="color: #000066;">isset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$theta</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$r</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                  <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$theta</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$r</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #cc66cc;">1</span>;
                <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
                  <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$theta</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>int<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$r</span><span style="color: #66cc66;">&#93;</span> ++;
                <span style="color: #66cc66;">&#125;</span>
             <span style="color: #66cc66;">&#125;</span>
         <span style="color: #66cc66;">&#125;</span>
      <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Donde la matriz $data es nuestro acumulador, finalmente graficamos los<br />
votos recibidos en esta matriz</p>
<p style="text-align: center;"><img class="aligncenter" title="Hough - Blog XYOX" src="http://img208.imageshack.us/img208/2664/ia3.png" alt="" width="360" height="248" /></p>
<p><a href="http://xyox.info/labs/hough_en_php_resumen.pdf">Descargar PDF</a><br />
<a href="http://xyox.info/labs/trans_hough.rar">Descargar Codigo</a></p>
<form id="vozme_form_6212d8f3fe79c495787180c2db1b13b6" method="post" name="vozme_form_6212d8f3fe79c495787180c2db1b13b6" target="6212d8f3fe79c495787180c2db1b13b6" action="http://vozme.com/text2voice.php"><input name="text" type="hidden" value="Detección de rectas a través la transformada de Hough implementación en PHP.. Bueeeno este fue un trabajo que presente en la universidad en Inteligencia Artificial, con respecto al tema en internet la gran parte de informacion esta en ingles, y tampoco hay la implementacion en PHP... asi que aqui publico el trabajito que hice  

El objetivo de esto es simple, necesitamos reconocer formas a partir de
simples líneas, cuadrados, rectángulos, triángulos y hasta círculos. Esto es un  reto para los métodos de inteligencia artificial, desde hace muchos años estos  métodos ya estaban en teoría desarrollados pero por las limitaciones de los  computadores, velocidad de procesamiento, memoria entre otras cosas era  muy pesado o poco probable desarrollar exitosamente estas técnicas.
Transformada de Hough
La transformada de Hough consiste en permitir descubrir las formas en una
imagen. Se basa en transformar puntos de la imagen en un espacio de
parámetros. La idea es encontrar rectas, como se menciono en teoría se
pueden encontrar varias formas, pero el costo computacional es elevado.
La aplicación mas simple de la transforma de hough es para la detección de
rectas, lo primero es tener una imagen binarizada, resultado de la detección
de bordes. Para cada punto x, y de la imagen que estemos utilizando pasan
infinitas rectas de la forma: y=ax+b, la ecuación de la recta. Luego cada
punto x, y vota para cada pareja de puntos que satisface b=y-ax.
El algoritmo tiene que recorrer todos los puntos x, y, y para cada uno votar
en el espacio de parámetros m, b o también llamado acumulador. Luego la
pareja m, b con más votos o el máximo del acumulador da la ecuación de la
recta.
Hasta aquí hemos llegado de manera sencilla con nuestro algoritmo, pero
existe un problema, los valores de m tienden al infinito, por lo que
almacenarlos y graficarlos será un impedimento para el uso de la
transformada.
La solución planteada es la siguiente, si bien y = ax + b, se dice que toda
ecuación puede ser representada en senos y cósenos es así que la ecuación de la recta de la forma y = ax + b, puede ser representada como:
p = xcos(θ) + ysen(θ)
Esta es la llamada ecuación en la forma normal de la recta, donde p es la
distancia de la recta al origen y θ es el ángulo entre la perpendicular y el eje  x, de esta forma son menos los puntos que hay que recorrer y por lo tanto más rápido es el algoritmo.
Los límites de estos están dados por las siguientes condiciones, θ varia entre 0 y 180 ya que a partir de 180 hasta 360 grados se vuelven a cruzar las curvas y p varia en la diagonal de la imagen es decir la hipotenusa con respecto a los lados de la imagen original.
Implementación en el lenguaje PHP
Si bien PHP esta orientado para el desarrollo de páginas dinámicas para entorno Web, eso no le quita potencialidad a la hora de usarlo como lenguaje de desarrollo para algoritmos complejos, ya que la gran facilidad que nos brinda en la manipulación de los tipos de datos lo hacen flexible a estas
situaciones.
PHP usa la librería GD para manipulación de imágenes, los pasos que
seguiremos en la implementación son los siguientes:

Implementación de un frontend simple
 Detección de bordes, aplicando el filtro Sobel.
 Binarizacion de las líneas en contraste con el fondo.
 Implementación del acumulador.
 Graficar el acumulador en una nueva imagen.

La interfaz será sencilla, constara de un formulario base donde podamos subir una imagen y cajas de entrada para la personalización del método a emplear:

Al momento de subir la imagen, la convertiremos dinámicamente al formato PNG de acuerdo a su actual extensión
switch &#40;$ext&#41; &#123;
case &quot;jpeg&quot;:
case &quot;jpg&quot;: $imEntrada = imagecreatefromjpeg&#40;$archivo&#91;&quot;tmp_name&quot;&#93;&#41;;
break;
case &quot;gif&quot;: $imEntrada = imagecreatefromgif&#40;$archivo&#91;&quot;tmp_name&quot;&#93;&#41;;
break;
case &quot;png&quot;: $imEntrada = imagecreatefromgif&#40;$archivo&#91;&quot;tmp_name&quot;&#93;&#41;;
break;
&#125;
imagepng&#40;$imEntrada,$this-&gt;IMG_ENTADA&#41;;
Donde this->IMG_ENTADA es el nombre de entrada que definimos previamente junto con el nombre de salida de las imágenes
$tratamiento = new TratamientoImagen&#40;&#41;;
$tratamiento-&gt;IMG_ENTADA = &quot;entrada.png&quot;;
$tratamiento-&gt;IMG_SALIDA = &quot;salida.png&quot;;
Necesitamos detectar los bordes de la imagen, en este resumen no incluiré la forma como se desarrollara la misma, en el proyecto presentado se uso el Filtro Sobel

Ahora podemos aplicar la transformada de Hough:
for &#40;$y=0; $y&lt;$alto; $y++&#41; &#123;
    for &#40;$x=0; $x&lt;$ancho; $x++&#41; &#123;
        if &#40;$matrImag&#91;$y&#93;&#91;$x&#93; == 1&#41; &#123;
           for &#40;$theta=0; $theta&lt;$maximoTheta; $theta+=1&#41; &#123;
                $r = $x * cos&#40;deg2rad&#40;$theta&#41;&#41; + $y * sin&#40;deg2rad&#40;$theta&#41;&#41;;
                if &#40;!isset&#40;$data&#91;&#40;int&#41;$theta&#93;&#91;&#40;int&#41;$r&#93;&#41;&#41; &#123;
                  $data&#91;&#40;int&#41;$theta&#93;&#91;&#40;int&#41;$r&#93; = 1;
                &#125; else &#123;
                  $data&#91;&#40;int&#41;$theta&#93;&#91;&#40;int&#41;$r&#93; ++;
                &#125;
             &#125;
         &#125;
      &#125;
&#125;
Donde la matriz $data es nuestro acumulador, finalmente graficamos los
votos recibidos en esta matriz

Descargar PDF
Descargar Codigo
" /><input name="lang" type="hidden" value="es" /><input name="gn" type="hidden" value="ml" /><input type="hidden" id="interface" name="interface" value="full" />
			<div style="margin-left:40%;">
			
				<input style="float:left;" type="image" width="40" height="40" src="http://xyox.info/wp-content/plugins/vozme/img/megaphone40x40w.gif" alt="Escucha este post" onclick="window.open('', '6212d8f3fe79c495787180c2db1b13b6', 'width=600,height=370,scrollbars=yes,location=yes,menubar=yes,resizable=yes,status=yes,toolbar=yes');">
				<div style="margin-left:48px; text-align:left;"><a style="font-size:12px;" href="javascript:void(0);" onclick="window.open('', '6212d8f3fe79c495787180c2db1b13b6', 'width=600,height=370,scrollbars=yes,location=yes,menubar=yes,resizable=yes,status=yes,toolbar=yes'); document.getElementById('vozme_form_6212d8f3fe79c495787180c2db1b13b6').submit();">Escucha<br/>este post</a></div>
			</div></form>]]></content:encoded>
			<wfw:commentRss>http://xyox.info/2009/10/14/deteccion-de-rectas-a-traves-la-transformada-de-hough-implementacion-en-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

