2
Na aula de hoje...
Representação de imagens• pixels, sistema RGB
Gráficos em MATLAB• Gráficos simples
• Imagens 2D• Exemplo: difusão
• Gráficos 3D• Exemplo: simulação estocástica de um incêndio
(Revisões)
4
O ecrã
O ecrã é uma matriz de picture elements (pixels)• a resolução é normalmente indicada por
linhas x colunas:• 1024 x 768, 800 x 600, ... (4:3),
• 1280 x 720, 1366 x 178, 1920×1080, … (16:9)
• cada imagem é também uma matriz de pixels
7
Cores
No formato True Color, cada pixel tem 3 bytes (24 bits) para representar a cor• RGB
• 1 byte (8 bits) para vermelho (Red)
• 1 byte (8 bits) para verde (Green)
• 1 byte (8 bits) para azul (Blue)
• Hexadecimal• números representados com 0, 1, …, 9, A, …, F
• dois dígitos = 16*16 = 256 combinações
• de 00 a FF
9
Cores
• “Cubo das cores”
• (0,0,0) preto
• (255,255,255) branco
• (255, 0, 0) vermelho
• (0, 255, 0) verde
• (0, 0, 255) azul
http://en.wikipedia.org/wiki/RGB_color_model
10
Manipulação do ecrã
CPU dá instruções de escritana RAM de vídeo, normalmente na placa gráfica.3 bytes por pixel em true color
11
Manipulação do ecrã
O controlador do ecrã na placa gráfica actualiza os pixels no ecrã, tipicamente 50 vezes por segundo (ou mais)
15
Gráficos em MATLAB
octave:1> x=-pi:0.1:pi;octave:2> y=sin(x);octave:3> plot(x,y,'*-r')octave:4> plot(x,-y,'+b')octave:5>
16
Gráficos em MATLAB
octave:1> x=-pi:0.1:pi;octave:2> y=sin(x);octave:3> plot(x,y,'*-r')octave:4> plot(x,-y,'+b')octave:5>
Nota:Em MATLAB (MATrix LABoratory) muitas operações comuns são estendidas a matrizes e vectores.
No entanto, isto não é verdade na generalidade das linguagens de programação.
17
Gráficos em MATLAB
octave:1> x=-pi:0.1:pi;octave:2> y=sin(x);octave:3> plot(x,y,'*-r')octave:4> plot(x,-y,'+b')octave:5> hold onoctave:6> plot(x,y,'*-r')octave:7>
18
Gráficos em MATLAB
Função fill(vx, vy, vCor)• vx vector com coordenadas x de 4 pontos
• vy vector com coordenadas y de 4 pontos
• vCor vector com 3 valores RGB, entre 0 e 1
20
Gráficos em MATLAB
colormap e image• com colormap definimos um mapa de cores.
• Matriz de 3 colunas, com uma cor RGB por linha
• a função image representa uma matriz com as cores definidas• Cada célula da matriz indica o índice (linha) da cor
no mapa de cores.
21
Gráficos em MATLAB
mapaCores=([1,0,0;0,1,0;0,0,1])imagem=floor(rand(50)*3)+1;colormap(mapaCores)image(imagem)
23
Simulação: difusão
Vamos simular a difusão de X numa solução (em 2D)• Uma matriz com concentrações
• A cada passo da simulação• calcular quanto difunde para os 8 vizinhos:
24
Simulação: difusão
Dividir em duas funções• é bom ter os cálculos numa parte:
• função para calcular um passo de difusão
function novaConc=passodifusao(matConc,coefDif)
• e os gráficos noutra:
• chama a anterior a cada passo e desenha o gráfico
function difusao(matConcs,coefDif,iteracoes)
31
Simulação: difusão
Normalmente evita-se aninhar muitos ciclos remetendo parte para outra função.Mas este caso exigiria copiar toda a matriz matConc, pelo que é mais eficiente deixar na mesma função.
32
Simulação: difusão
A indentação é muito importante nestes casos. Sem indentação correcta o código fica ilegível e muito mais propenso a erros (por exemplo, faltar o end).
33
Simulação: difusão
Calcular quanto se difunde e actualizar na matriz da nova concentração.Actualizamos na nova para não alterar os valores a usar para as outras células.
34
Simulação: difusão
testar passodifusao
octave:83> testMat=[0,0,0;0,1,0;0,0,0]testMat = 0 0 0 0 1 0 0 0 0
octave:84> tesMat=passodifusao(testMat,0.1)tesMat = 0.050000 0.100000 0.050000 0.100000 0.400000 0.100000 0.050000 0.100000 0.050000
37
Simulação: difusão
Para cada iteração calcular um passo de difusão e desenhar a imagem. O comando axis square evita a distorção da imagem e o refresh obriga a desenhar o gráfico durante a simulação.
39
Simulação: difusão
Salpicos
concs=zeros(30);
concs(2:end-1,2:end-1)=... (rand(28)>0.9)*500;
difusao(concs,0.05,60);
41
Gráficos em MATLAB
Para fazer um gráfico em 3D precisamos de• Matrizes X, Y, Z
• para associar um valor z a cada par (x,y)
x =
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
y =
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
z =
5 4 1 8 10 7 10 7 10 6 9 6 6 7 5 4 3 7 7 2 7 1 5 3 9
42
Gráficos em MATLAB
Nota:• matrizes são indexadas por (linha, coluna)
• mas x varia na horizontal e y na vertical
• logo, x é a coluna e y a linha• é preciso atenção a esta convenção
x =
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
y =
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
z =
5 4 1 8 10 7 10 7 10 6 9 6 6 7 5 4 3 7 7 2 7 1 5 3 9
43
Gráficos em MATLAB
Para fazer um gráfico em 3D precisamos de• Matrizes X, Y, Z
• as matrizes x e y podem ser criadas com a função meshgrid
e.g. [xx,yy]=meshgrid(1:5,1:5)
• chamar a funçãomesh(x,y,z) traça uma rede 3D
surf(x,y,z) traça uma superfície 3D
45
Gráficos em MATLAB
Especificar cores:• Podemos acrescentar uma matriz para indicar
quais as cores a usar• tem de ter a mesma dimensão das outras
• as cores são as do colormap corrente, interpoladas.
• o menor valor da matriz C corresponde à primeira cor do mapa de cores
• o maior valor da matriz C corresponde à última cor do mapa de cores
• os valores intermédios são interpolados
47
Gráficos em MATLAB
Para mudar a orientação:view(azimute, elevação)
octave:118> view(45,20)octave:119> view(85,60)
49
Monte Carlo
Nome cunhado pelo matemático Nicholas Constantine Metropolis• (1915-1999)
Conjunto de métodos baseados em números (pseudo) aleatórios.
50
Simular um incêndio
Objectivo• Temos uma matriz com a elevação do terreno
http://visibleearth.nasa.gov/view.php?id=73934
51
Simular um incêndio
Objectivo• Queremos simular como um incêndio se
propaga no terreno• pode haver vento ou outros factores
52
Simular um incêndio
Simulação• numa matriz, cada célula indica que a
vegetação está• 1- normal
• 2- queimada
• 3- a arder
• a que está a arder pode propagar o fogo aos 8 vizinhos• com uma probabilidade que depende do declive,
vento, etc
53
Simular um incêndio
Simulação• a probabilidade de propagar o fogo a cada
vizinho pode ser dada por uma matriz de 3x3• assim podemos simular vento ou outros factores
dando valores diferentes para direcções diferentes
• modificada pelo declive
54
Simular um incêndio
Simulação• probabilidade de propagar o fogo:
• modificada pelo declive• somar um factor dependente da diferença de
elevação
• mais provável propagar-se a subir
0.10000 0.14000 0.100000.14000 0.00000 0.140000.10000 0.14000 0.10000
55
Simular um incêndio
Simulação• a cada iteração da simulação temos de
• propagar o fogo de todas as áreas a arder
• testar as áreas a arder para determinar quais se apagam
• para a simulação temos de• calcular cada iteração
• representar graficamente o progresso do incêndio
• 3 funções
56
Simular um incêndio
Simulação• Assinaturas das funções:
function novoEstado=propaga(estado, ... mapa,probPropagar,efeitoDeclive)
function estado=extingue(estado,probApagar)
function incendio(mapa,focoInicial, ... probPropagar,probApagar, ... efeitoDeclive,iteracoes)
58
Simular um incêndio
Para todas as células internas da matriz que estejam a arder.(Não queremos propagar as da fronteira para evitar sair dos limites da matriz).
59
Simular um incêndio
Para todos os vizinhos por arder dessa célula.Nota: não precisamos excluir a própria célula porque essa está a arder.
60
Simular um incêndio
Calculamos a probabilidade de propagação modificando o valor da matriz pelo declive (mais provável propagar-se para cima).
61
Simular um incêndio
Se propaga, marcamos no novoEstado (e não no estado para evitar propagar imediatamente esse novo foco).Nota: rand devolve um valor pseudo-aleatório entre 0 e 1.
63
Simular um incêndio
Para simular• preparar o gráfico
• ciclo das iterações• propagar
• extinguir
• desenhar
65
Simular um incêndio
Cria a matriz com o estado inicial da vegetação e o mesmo tamanho da matriz com a elevação do terreno. Podia ser: ones(size(mapa,1),size(mapa,2))Depois inicia o incêndio.
66
Simular um incêndio
Prepara as matrizes para o gráfico 3D. Nota: x é colunas, y linhas.Cria o mapa de cores (verde para normal, preto para queimado, laranja para fogo).
67
Simular um incêndio
A cada iteração propaga e extingue os fogos activos com as probabilidades respectivas.
68
Simular um incêndio
Depois desenha o gráfico, orienta-o adequadamente e força a sua actualização.(Sem o refresh só veríamos o gráfico no final da simulação)
69
Simular um incêndio
Sem vento nem declive
probPropagar =
0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000
efeitoDeclive = 0
70
Simular um incêndio
Só declive
probPropagar =
0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000
efeitoDeclive = 0.1
71
Simular um incêndio
probPropagar =
0.04000 0.02000 0.04000 0.14000 0.00000 0.14000 0.20000 0.40000 0.20000
efeitoDeclive = 0.1
Declive e vento
73
Resumindo
Imagens 2D• fill(coordsX, coordsY ,corRGB)
• colormap(matrizCoresRGB) image(matrizIndicesCores)
Gráficos 3D• meshgrid(x,y),
• mesh ou surf (x,y,z), ou (x,y,z,c)
• view(azimute, declinação)
74
Para estudar esta aula
Manual Octave• Capítulo 15, plotting
MATLAB plotting functions• http://www.mathworks.com/help/matlab/creati
ng_plots/using-high-level-plotting-functions.html
Por curiosidade• Método Monte Carlo:
• http://en.wikipedia.org/wiki/Monte_Carlo_method