Tag Archive for algoritmo

Transformando imagens em arte ASCII com PHP

Para mostrar que programar não é puramente escravidão, trouxe um pequeno código para deixar o dia mais divertido.
Venho hoje ensinar como transformar imagens em arte ASCII, utilizando a linguagem de programação PHP.

No nosso exemplo iremos pegar esta imagem:

E transformar em mais ou menos isso:

Para tanto iremos precisar da linguagem PHP (como diz o título do artigo, duh!) e da biblioteca GD ativada nas configurações da linguagem, o que é bastante comum nos servidores e instalações desktop (vide xampp).

O código que faz a conversão é o seguinte:

<?php

/*    abrimos a imagem    */
$arquivo = imagecreatefromjpeg("epic.jpg");

/*    verificamos se estamos com o stream aberto    */
if ( $arquivo ) {

    /*    pegamos a largura e a altura da imagem para ser utilizado no loop de leitura    */
    $largura = imagesx( $arquivo );
    $altura = imagesy( $arquivo );

    /*    damos um loop de linha em linha    */
    for ( $y = 0; $y < $altura; $y = $y + 1 ) {

        /*    damos o loop para ir de colona em coluna    */
        for( $x = 0; $x < $largura; $x = $x + 1 ) {

            /*    pegamos a cor alocada na posição (x, y) da iamgem    */
            $rgb = @imagecolorat($arquivo, $x, $y);
            $cores = imagecolorsforindex($arquivo, $rgb);

            /*    imprimimos um * com a cor do ponto    */
            echo "<font style='color:rgb("
                . $cores["red"] . ","
                . $cores["green"] . ","
                . $cores["blue"] . ")'>*</font>";

        }

        /*    chegamos ao fim do loop das colunas, então iremos imprimir a próxima linha    */
        echo "<br>";
    }
}
?>

Alguns podem não estar familiarizados com as funções:

  • ImageColorAt – Que le o ponto (x, y) da imagem e retorna um inteiro contento as cores R,G,B daquele pontoImageColorsForIndex – Que recebe o valor gerado por ImageColorAt e o divide em um array, o que facilita o nosso trabalho

Como podemos melhorar o nosso código?

Notem que o nosso loop lê a imagem ponto-a-ponto. Isso é legal pois deixa o nosso resultado bastante nítido, mas a ponto de desempenho é absolutamente pífio.
Podemos dar uma melhorada no desempenho da nossa conversão reduzindo a quantidade de pontos retirados da imagem, mas tentando evitar a perda de nitidez.

Ao invez de pegar ponto-a-ponto na imagem podemos pegar 1 ponto a cada 3 pontos fazendo a seguinte alteração:

alterar a linha 17 que contém:

for( $x = 0; $x < $largura; $x = $x + 1 ) {

para:

for( $x = 0; $x < $largura; $x = $x + 3 ) {

Note que o desempenho atual foi bem maior e que a sua imagem pode ter ficado um pouco distorcida.
Para melhorar o problema da distorção, faça a mesma alteração no loop das linhas, alterando a linha 14 que contém:

for ( $y = 0; $y < $altura; $y = $y + 1 ) {

para:

for ( $y = 0; $y < $altura; $y = $y + 3 ) {

Claro que este código pode ser melhorado mil vezes, tanto em desempenho quanto em funcionalidade.
Ele pode ser alterado para abranger outros formatos de imagem usando funções como ImageCreateFromGif, ImageCreateFromPng, etc.

 

Este artigo foi escrito no site PapoGeek e pode ser lido na URL:
http://www.papogeek.com.br/2010/07/transformando-imagens-em-arte-ascii-com-php

Algoritmo competitivo e sua complexidade computacional

Em 2010, na Universidade Católica de Pernambuco, desenvolvi um projeto junto com um amigo sobre a complexidade computacional do algoritmo de aprendizagem competitivo, para a cadeira de inteligência artificial ministrada pelo professor Francisco Madeiro.
O algoritmo, e sua complexidade computacional, foram inferidos do artigo Complexidade Computacional de um Algoritmo Competitivo Aplicado ao Projeto de Quantizadores Vetoriais, escrito pelo professor Madeiro em conjunto com outros mestres para a revista da Sociedade Brasileira de Redes Neurais.

A implementação foi feita usando a linguagem de programação Python, a biblioteca Python para manipulação de imagens PIL e a biblioteca de interface gráfica padrão Tkinter.

A aplicação recebe como dados de entrada:

  • k = A quantidade de números que irão compor cada vetor;
  • w = A quantidade de vetores de peso (W);
  • nAC = A quantidade de iterações de aprendizagem;
  • Fator de aprendizagem inicial;
  • Fator de aprendizagem final;
  • Um arquivo contendo os números que serão utilizados pelo algoritmo;

A aplicação gera/retorna:

  • Retorna os vetores de peso inicial;
  • Retorna os vetores de peso após as iterações de aprendizagem;
  • Retorna a quantidade de operações utilizadas no processo de aprendizagem;
  • Gera um arquivo chamado VetoresDeTreino.jpg que exibe todos os vetores de treino;
  • Gera um arquivo chamado VetoresDePesoAntes.jpg que exibe todos os vetores de peso antes do aprendizado;
  • Gera um arquivo chamado VetoresDePesoDepois.jpg que exibe todos os vetores de peso depois do aprendizado;

Note que as 3 imagens só serão geradas se a quantidade de números (k) que irão compor cada vetor for igual a 2 (duas dimensões).

O projeto pode ser baixado no link Algoritmo competitivo em Python ou através da URL:
www.frenetic.com.br/projetos/ia_python/IA_Python.zip

Screenshots do projeto:

Janela Principal

VetoresDeTreino.jpg

vetorPesoAntes.jpg

vetorPesoDepois.jpg