Computação Gráfica em Python

35
Computação Gráfica em Luiz Eduardo Borges http://ark4n.wordpress.com/

description

Luiz Eduardo Borges

Transcript of Computação Gráfica em Python

Page 1: Computação Gráfica em Python

Computação Gráfica em

Luiz Eduardo Borgeshttp://ark4n.wordpress.com/

Page 2: Computação Gráfica em Python

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

VPython (exemplo C-II)

Esfera b

Sombra s

Caixas

Janela de saída

Page 22: Computação Gráfica em Python

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

Blender (cena)

Câmera

Fonte de luz

Objetos

Page 24: Computação Gráfica em Python

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

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

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

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

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

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

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

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

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

Blender (exemplo D-X)

Cena final

Page 34: Computação Gráfica em Python

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

Computação Gráfica em

Luiz Eduardo Borgeshttp://ark4n.wordpress.com/

Fim