Upload
gsroma
View
8.116
Download
27
Embed Size (px)
DESCRIPTION
Luiz Eduardo Borges
Citation preview
Sumário
● Computação gráfica
● Imagens em 2D
● Processamento de imagens
● Modelagem 3D
● Animação
Foto alterada com o filtro Cubism do GIMP.
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.
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).
Processamento de imagem
Algoritmos
Imagem original em um formato raster (mapa de bits).
Imagem processada (filtro GIMPressionist / Mossy, do
GIMP).
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.
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.
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.
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.
PIL (exemplo A-IV)
CONTOUR
for0.png
EMBOSS
for1.png
FIND_EDGES
for2.png
lamdba i: i *3
for3.png
Arquivos de saída
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.
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.
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.
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
3D (I)
Wireframe Materiais
O wireframe representa a estrutura dos objetos que
compõem a cena.
Os materiais são aplicados aos objetos.
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.
3D (III)
Sombras
Texturas
Reflexão
A imagem é gerada aplicando um algoritmo
(como o raytracing), que calcula cada ponto
da saída.
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.
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.
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.
VPython (exemplo C-II)
Esfera b
Sombra s
Caixas
Janela de saída
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.
Blender (cena)
Câmera
Fonte de luz
Objetos
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
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
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
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...
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
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
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
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
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
Blender (exemplo D-X)
Cena final
Referências
PIL:● http://www.pythonware.com/products/pil/
Matplotlib:● http://matplotlib.sourceforge.net/
VPython:● http://vpython.org/
Blender:● http://www.blender.org/
Computação Gráfica em
Luiz Eduardo Borgeshttp://ark4n.wordpress.com/
Fim