Computação Gráfica em Python

10.019 visualizações

Publicada em

Luiz Eduardo Borges

Publicada em: Tecnologia, Arte e fotografia
0 comentários
6 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
10.019
No SlideShare
0
A partir de incorporações
0
Número de incorporações
83
Ações
Compartilhamentos
0
Downloads
288
Comentários
0
Gostaram
6
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Computação Gráfica em Python

  1. 1. Computação Gráfica em Luiz Eduardo Borges http://ark4n.wordpress.com/
  2. 2. Sumário ● Computação gráfica ● Imagens em 2D ● Processamento de imagens ● Modelagem 3D ● Animação Foto alterada com o filtro Cubism do GIMP.
  3. 3. Computação gráfica Definições: ● Área da ciência da computação que estuda a geração e manipulação de conteúdo visual. ● Tecnologias associadas a criação e manipulação de imagens digitais. ● Representação e manipulação de dados visuais usando Cena 3D renderizada no Blender. computadores.
  4. 4. Imagens em 2D (raster) A imagem é composta por pixels (picture elements), com uma cor associada. RGB = (102, 153, 102) Imagem RGB = (102, 153, 204) RGB = (102, 153, 153) Geralmente, as cores dos pixels são representadas em RGB (Red, RGB = (51, 102, 153) Blue, Green).
  5. 5. Processamento de imagem Imagem original em um formato raster (mapa de bits). Algoritmos Imagem processada (filtro GIMPressionist / Mossy, do GIMP).
  6. 6. PIL (Python Imaging Library) Implementa: ● Ferramentas para cortar, redimensionar e mesclar imagens. ● Algoritmos de conversão. ● Filtros, tais como suavizar e detectar bordas. ● Ajustes, incluindo brilho e contraste. ● Operações com paletas de cores. ● Desenhos simples em 2D. ● Rotinas para tratamento de imagens: equalizar, deformar, inverter e outras.
  7. 7. PIL (exemplo A-I) import Image O módulo Image define uma from ImageFilter import * classe para tratar imagens com fn = 'for.png' vários métodos para modificar im = Image.open(fn) suas características. for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), O módulo ImageFilter provê Image.ANTIALIAS) filtros mais comuns para o fl.save(fn.replace('.png', '%d.png' % i), processamento de imagens. 'PNG') pn = im.point(lambda i: i * 3) pn.thumbnail((512, 512), Image.ANTIALIAS) pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
  8. 8. PIL (exemplo A-II) import Image A função open() cria objetos da from ImageFilter import * classe Image a partir de arquivos. Vários formatos são fn = 'for.png' suportados. im = Image.open(fn) for i, filter in enumerate((CONTOUR, Os filtros CONTOUR, EMBOSS, FIND_EDGES)): EMBOSS e FIND_EDGES são fl = im.filter(filter) alguns que estão disponíveis em fl.thumbnail((512, 512), ImageFilter. Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG') O método filter() aplica o filtro especificado na imagem. pn = im.point(lambda i: i * 3) pn.thumbnail((512, 512), Image.ANTIALIAS) pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
  9. 9. PIL (exemplo A-III) import Image from ImageFilter import * fn = 'for.png' O método thumbnail() im = Image.open(fn) redimenciona a imagem. Com antialias, a imagem resultante for i, filter in enumerate((CONTOUR, fica mais suave. EMBOSS, FIND_EDGES)): fl = im.filter(filter) O método save() grava a imagem fl.thumbnail((512, 512), em arquivo no formato Image.ANTIALIAS) especificado. fl.save(fn.replace('.png', '%d.png' % i), 'PNG') O método point() aplica uma pn = im.point(lambda i: i * 3) função a cada ponto da imagem. pn.thumbnail((512, 512), Image.ANTIALIAS) pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
  10. 10. PIL (exemplo A-IV) Arquivos de saída CONTOUR EMBOSS FIND_EDGES lamdba i: i *3 for0.png for1.png for2.png for3.png
  11. 11. Imagens em 2D (vetorial) A imagem é gerada a partir de instruções que descrevem os objetos. As instruções são primitivas geométricas, tais como linha, Arquivo SVG gerado no ponto, círculo e outros. Inkscape.
  12. 12. Pylab / Matplotlib Implementa: ● Pylab: API destinada ao uso interativo. ● Matplotib: API orientada a objetos. ● Vários gráficos 2D mais usados: linhas, barras, pizza, dispersão e outros. ● Suporte a gráficos 3D (limitado). ● Vários backends, que permitem exportar para vários formatos populares.
  13. 13. Pylab / Matplotlib (exemplo B-I) A função subplot() divide e from pylab import * seleciona um pedaço da área da ent = arange(0., 20.1, .1) figura (311 => 3 linhas, 1 coluna, na primeira posição). subplot(311) sai = cos(ent) plot(ent, sai, lw=3, c=(.1, .25, .5)) A função plot() desenha uma ylabel('A') linha. subplot(312) sai = sin(ent) Texto para o eixo Y. plot(ent, sai, lw=3, c=(.1, .5, .25)) ylabel('B') subplot(313) sai = cos(ent) * sin(ent) plot(ent, sai, lw=3, c=(.1, .5, .5)) Texto para o eixo X. xlabel('entrada') ylabel('A x B') Salva a imagem em arquivo PNG. savefig('graf.png', dpi=100)
  14. 14. Pylab / Matplotlib (exemplo B-II) from pylab import * Arquivo de saída ent = arange(0., 20.1, .1) subplot(311) A sai = cos(ent) plot(ent, sai, lw=3, c=(.1, .25, .5)) ylabel('A') subplot(312) B sai = sin(ent) plot(ent, sai, lw=3, c=(.1, .5, .25)) ylabel('B') AxB subplot(313) sai = cos(ent) * sin(ent) plot(ent, sai, lw=3, c=(.1, .5, .5)) xlabel('entrada') ylabel('A x B') graf.png savefig('graf.png', dpi=100)
  15. 15. 3D (I) Wireframe Materiais O wireframe representa a Os materiais são aplicados estrutura dos objetos que aos objetos. compõem a cena.
  16. 16. 3D (II) Shading Texturas Sombreamento define como Texturas são imagens raster cada objeto da cena reage que são aplicadas aos a luz. materiais.
  17. 17. 3D (III) Texturas Sombras A imagem é gerada aplicando um algoritmo (como o raytracing), Reflexão que calcula cada ponto da saída.
  18. 18. Animação (técnica keyframe) Keyframe 1 Keyframe 2 001 025 050 Keyframe 3 075 100 125 Os frames entre os keyframes são calculador por interpolação.
  19. 19. VPython Implementa: ● Vários objetos 3D simples (cubo, esfera, cilindro, pirâmide, espiral, ...). ● Recursos para facilitar animações. ● Iluminação, zoom e pan automáticos. ● Controles interativos.
  20. 20. VPython (exemplo C-I) Desenha quatro caixas. from visual import * box(pos=(12, 0, 0) , length=1 , height=21 , width=29) box(pos=(-12, 0, 0) , length=1 , height=21 , width=29) box(pos=(0, 10, 0) , length=25 , height= 1 , width=29) box(pos=(0, -10, 0) , length=25 , height=1 , width=29) x, y, z = .1, .1, .1 Desenha a esfera e sombra. b = sphere(pos=(3, 5, 7), radius=1.2) s = cylinder(pos=(3, -10, 7), axis=(0, .5, 0), color=color.black) while True: Move a esfera e a sombra. b.pos += (x, y, z) s.x, s.z = b.x, b.z Muda a direção da esfera e da if abs(b.x) > 10: x = -x sombra. if abs(b.y) > 8: y = -y if abs(b.z) > 12: z = -z rate(100) Controla a velocidade da animação.
  21. 21. VPython (exemplo C-II) Janela de saída Caixas Esfera b Sombra s
  22. 22. Blender Implementa: ● Modelagem 3D avançada, com materiais, texturas, iluminação, extrusão, entre outros. ● Recursos de animação sofisticados. ● Um game engine poderoso. ● Uma API que permite uso do Python.
  23. 23. Blender (cena) Fonte de luz Câmera Objetos
  24. 24. Blender (exemplo D-I) import math import Blender Câmera # A cena atual cena = Blender.Scene.GetCurrent() # Muda a camera de lugar camera = Blender.Object.Get()[0] camera.setLocation(9., -9., 7.) # Remove da cena o objeto quot;defaultquot; cubo = Blender.Object.Get()[1] cena.objects.unlink(cubo) # Cria uma fonte de luz lampada = Blender.Lamp.New('Lamp') lamp = Blender.Object.New('Lamp') # Muda o lugar da fonte (default = 0.0, 0.0, 0.0) lamp.setLocation(6., -6., 6.) Continua...
  25. 25. Blender (exemplo D-II) # quot;Prendequot; a fonte de luz na cena Fonte de luz lamp.link(lampada) cena.objects.link(lamp) # Cria um material material1 = Blender.Material.New('newMat1') material1.rgbCol = [.25, .25, .32] material1.setAlpha(1.) # Cria uma textura textura1 = Blender.Texture.Get()[0] textura1.setType('Clouds') textura1.noiseType = 'hard' # Coloca no material material1.setTexture(0, textura1) mtex = material1.getTextures()[0] mtex.col = (.18, .18, .22) Continua...
  26. 26. Blender (exemplo D-III) # Cria o piso mesh = Blender.Mesh.Primitives.Plane(25.) piso = cena.objects.new(mesh,'Mesh') piso.setEuler(0., 0., math.radians(45)) # Coloca o material no piso piso.setMaterials([material1]) piso.colbits = 1 # Cria outro material material2 = Blender.Material.New('newMat2') material2.rgbCol = [.52, .61, .62] material2.setAlpha(1.) # Cria outra textura textura2 = Blender.Texture.Get()[0] Piso textura2.setType('Stucci') textura2.noiseType = 'hard' Continua...
  27. 27. Blender (exemplo D-IV) # Coloca no material material2.setTexture(0, textura2) mtex = material2.getTextures()[0] mtex.col = (.22, .22, .32) # Cria objetos na cena def objeto(local, tam, mat, prim=Blender.Mesh.Primitives.Cube): mesh = prim() obj = cena.objects.new(mesh, 'Mesh') obj.setLocation(*local) obj.size = tam obj.setMaterials(mat) obj.colbits = 1 return obj mat = [material2] Continua...
  28. 28. Blender (exemplo D-V) # Primitiva do cilindro prim = Blender.Mesh.Primitives.Cylinder # Cria colunas no fundo for i in xrange(16): # Topo da primeira fileira local = (i - 8., 8., 2.5) tam = (.25, .25, .1) objeto(local, tam, mat) # Base da primeira fileira local = (i - 8., 8., 0.) objeto(local, tam, mat) # Corpo da primeira fileira Colunas tam = (.2, .2, 2.5) objeto(local, tam, mat, prim) Continua...
  29. 29. Blender (exemplo D-VI) # Topo da segunda fileira Aqueduto local = (-8., i - 8., 2.5) tam = (.25, .25, .1) objeto(local, tam, mat) # Base da segunda fileira local = (-8., i - 8., 0.) objeto(local, tam, mat) # Corpo da segunda fileira tam = .2, .2, 2.5 objeto(local, tam, mat, prim) # Aqueduto local = (-8., i - 8., 3.) tam = (.5, .5, .5) objeto(local, tam, mat) local = (i - 8., 8., 3.) objeto(local, tam, mat) Continua...
  30. 30. Blender (exemplo D-VII) # Cria colunas em cima do piso for i in (-3, 3): for j in range(-3, 4): # Topo das fileiras X local = (i, j, 2.5) tam = (.25, .25, .1) objeto(local, tam, mat) # Topo das fileiras Y local = (j, i, 2.5) objeto(local, tam, mat) # Base das fileiras X local = (i, j, .5) objeto(local, tam, mat) Colunas Continua...
  31. 31. Blender (exemplo D-VIII) # Base das fileiras Y local = (j, i, .5) objeto(local, tam, mat) # Corpo das fileiras X local = (i, j, 0) tam = (.2, .2, 2.5) objeto(local, tam, mat, prim) # Corpo das fileiras Y local = (j, i, 0) objeto(local, tam, mat, prim) # Cria escada for i in xrange(4): Escada local = (0., 0., i / 16.) tam = (2. + (8. - i) / 4.,2. + (8. - i) / 4., .25) objeto(local, tam, mat) Continua...
  32. 32. Blender (exemplo D-IX) # Cria teto for i in xrange(35): local = (0., 0., 2.7 + i / 60.) tam = (3.5 , 3.5 * ( 1. - i / 35.), .1) objeto(local, tam, mat) # Atualiza a cena cena.update() Teto
  33. 33. Blender (exemplo D-X) Cena final
  34. 34. Referências PIL: ● http://www.pythonware.com/products/pil/ Matplotlib: ● http://matplotlib.sourceforge.net/ VPython: ● http://vpython.org/ Blender: ● http://www.blender.org/
  35. 35. Computação Gráfica em Luiz Eduardo Borges http://ark4n.wordpress.com/ Fim

×