computação gráfica em python
DESCRIPTION
Luiz Eduardo BorgesTRANSCRIPT
![Page 2: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/2.jpg)
Sumário
● Computação gráfica
● Imagens em 2D
● Processamento de imagens
● Modelagem 3D
● Animação
Foto alterada com o filtro Cubism do GIMP.
![Page 3: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/3.jpg)
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 computadores.
Cena 3D renderizada no Blender.
![Page 4: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/4.jpg)
Imagens em 2D (raster)
Imagem
RGB = (102, 153, 204)
RGB = (51, 102, 153)
RGB = (102, 153, 153)
RGB = (102, 153, 102)
A imagem é composta por pixels (picture elements), com uma cor
associada.
Geralmente, as cores dos pixels são representadas em RGB (Red,
Blue, Green).
![Page 5: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/5.jpg)
Processamento de imagem
Algoritmos
Imagem original em um formato raster (mapa de bits).
Imagem processada (filtro GIMPressionist / Mossy, do
GIMP).
![Page 6: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/6.jpg)
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.
![Page 7: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/7.jpg)
import Imagefrom ImageFilter import *
fn = 'for.png'im = Image.open(fn)
for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')
pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
PIL (exemplo A-I)
O módulo Image define uma classe para tratar imagens com vários métodos para modificar
suas características.
O módulo ImageFilter provê filtros mais comuns para o
processamento de imagens.
![Page 8: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/8.jpg)
PIL (exemplo A-II)import Imagefrom ImageFilter import *
fn = 'for.png'im = Image.open(fn)
for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')
pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
A função open() cria objetos da classe Image a partir de
arquivos. Vários formatos são suportados.
Os filtros CONTOUR, EMBOSS e FIND_EDGES são
alguns que estão disponíveis em ImageFilter.
O método filter() aplica o filtro especificado na imagem.
![Page 9: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/9.jpg)
PIL (exemplo A-III)import Imagefrom ImageFilter import *
fn = 'for.png'im = Image.open(fn)
for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')
pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')
O método save() grava a imagem em arquivo no formato
especificado.
O método point() aplica uma função a cada ponto da imagem.
O método thumbnail() redimenciona a imagem. Com antialias, a imagem resultante
fica mais suave.
![Page 10: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/10.jpg)
PIL (exemplo A-IV)
CONTOUR
for0.png
EMBOSS
for1.png
FIND_EDGES
for2.png
lamdba i: i *3
for3.png
Arquivos de saída
![Page 11: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/11.jpg)
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,
ponto, círculo e outros.Arquivo SVG gerado no
Inkscape.
![Page 12: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/12.jpg)
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.
![Page 13: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/13.jpg)
Pylab / Matplotlib (exemplo B-I)
from pylab import *ent = arange(0., 20.1, .1)
subplot(311)sai = cos(ent)plot(ent, sai, lw=3, c=(.1, .25, .5))ylabel('A')
subplot(312)sai = sin(ent)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))xlabel('entrada')ylabel('A x B')
savefig('graf.png', dpi=100)
A função subplot() divide e seleciona um pedaço da área da figura (311 => 3 linhas, 1 coluna,
na primeira posição).
A função plot() desenha uma linha.
Texto para o eixo Y.
Texto para o eixo X.
Salva a imagem em arquivo PNG.
![Page 14: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/14.jpg)
Pylab / Matplotlib (exemplo B-II)
from pylab import *ent = arange(0., 20.1, .1)
subplot(311)sai = cos(ent)plot(ent, sai, lw=3, c=(.1, .25, .5))ylabel('A')
subplot(312)sai = sin(ent)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))xlabel('entrada')ylabel('A x B')
savefig('graf.png', dpi=100)
A
B
A x B
Arquivo de saída
graf.png
![Page 15: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/15.jpg)
3D (I)
Wireframe Materiais
O wireframe representa a estrutura dos objetos que
compõem a cena.
Os materiais são aplicados aos objetos.
![Page 16: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/16.jpg)
3D (II)
Shading TexturasTexturas
Sombreamento define como cada objeto da cena reage
a luz.
Texturas são imagens raster que são aplicadas aos
materiais.
![Page 17: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/17.jpg)
3D (III)
Sombras
Texturas
Reflexão
A imagem é gerada aplicando um algoritmo
(como o raytracing), que calcula cada ponto
da saída.
![Page 18: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/18.jpg)
Animação (técnica keyframe)
001 025 050
075 100 125
Keyframe 1 Keyframe 2
Keyframe 3
Os frames entre os keyframes são calculador por interpolação.
![Page 19: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/19.jpg)
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.
![Page 20: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/20.jpg)
VPython (exemplo C-I)
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, .1b = sphere(pos=(3, 5, 7), radius=1.2)s = cylinder(pos=(3, -10, 7), axis=(0, .5, 0), color=color.black)
while True: b.pos += (x, y, z) s.x, s.z = b.x, b.z if abs(b.x) > 10: x = -x if abs(b.y) > 8: y = -y if abs(b.z) > 12: z = -z rate(100)
Desenha quatro caixas.
Desenha a esfera e sombra.
Move a esfera e a sombra.
Muda a direção da esfera e da sombra.
Controla a velocidade da animação.
![Page 21: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/21.jpg)
VPython (exemplo C-II)
Esfera b
Sombra s
Caixas
Janela de saída
![Page 22: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/22.jpg)
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.
![Page 23: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/23.jpg)
Blender (cena)
Câmera
Fonte de luz
Objetos
![Page 24: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/24.jpg)
Blender (exemplo D-I)
import mathimport Blender
# A cena atualcena = Blender.Scene.GetCurrent()
# Muda a camera de lugarcamera = Blender.Object.Get()[0]camera.setLocation(9., -9., 7.)
# Remove da cena o objeto "default"cubo = Blender.Object.Get()[1]cena.objects.unlink(cubo)
# Cria uma fonte de luzlampada = 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...
Câmera
![Page 25: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/25.jpg)
Blender (exemplo D-II)
# "Prende" a fonte de luz na cenalamp.link(lampada)cena.objects.link(lamp)
# Cria um materialmaterial1 = Blender.Material.New('newMat1')material1.rgbCol = [.25, .25, .32]material1.setAlpha(1.)
# Cria uma texturatextura1 = Blender.Texture.Get()[0]textura1.setType('Clouds')textura1.noiseType = 'hard'
# Coloca no materialmaterial1.setTexture(0, textura1)mtex = material1.getTextures()[0]mtex.col = (.18, .18, .22)
Continua...
Fonte de luz
![Page 26: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/26.jpg)
Blender (exemplo D-III)
# Cria o pisomesh = Blender.Mesh.Primitives.Plane(25.)piso = cena.objects.new(mesh,'Mesh')piso.setEuler(0., 0., math.radians(45))
# Coloca o material no pisopiso.setMaterials([material1])piso.colbits = 1
# Cria outro materialmaterial2 = Blender.Material.New('newMat2')material2.rgbCol = [.52, .61, .62]material2.setAlpha(1.)
# Cria outra texturatextura2 = Blender.Texture.Get()[0]textura2.setType('Stucci')textura2.noiseType = 'hard'
Continua...
Piso
![Page 27: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/27.jpg)
Blender (exemplo D-IV)
# Coloca no materialmaterial2.setTexture(0, textura2)mtex = material2.getTextures()[0]mtex.col = (.22, .22, .32)
# Cria objetos na cenadef 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...
![Page 28: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/28.jpg)
Blender (exemplo D-V)
# Primitiva do cilindroprim = Blender.Mesh.Primitives.Cylinder
# Cria colunas no fundofor 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 tam = (.2, .2, 2.5) objeto(local, tam, mat, prim)
Continua...
Colunas
![Page 29: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/29.jpg)
Blender (exemplo D-VI) # Topo da segunda fileira 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...
Aqueduto
![Page 30: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/30.jpg)
Blender (exemplo D-VII)
# Cria colunas em cima do pisofor 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)
Continua...
Colunas
![Page 31: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/31.jpg)
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 escadafor i in xrange(4):
local = (0., 0., i / 16.) tam = (2. + (8. - i) / 4.,2. + (8. - i) / 4., .25) objeto(local, tam, mat)
Continua...
Escada
![Page 32: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/32.jpg)
Blender (exemplo D-IX)
# Cria tetofor 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 cenacena.update()
Teto
![Page 33: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/33.jpg)
Blender (exemplo D-X)
Cena final
![Page 34: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/34.jpg)
Referências
PIL:● http://www.pythonware.com/products/pil/
Matplotlib:● http://matplotlib.sourceforge.net/
VPython:● http://vpython.org/
Blender:● http://www.blender.org/
![Page 35: Computação Gráfica em Python](https://reader030.vdocuments.mx/reader030/viewer/2022012400/555a705ad8b42ae7218b52f3/html5/thumbnails/35.jpg)
Computação Gráfica em
Luiz Eduardo Borgeshttp://ark4n.wordpress.com/
Fim