Informática para Ciências e Engenharias 2013/14 Teórica 5
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) 2
Ecrã, imagens e pixels 3
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 4
A imagem 5
Pixels representam caracteres 6
Cores No formato True Color, cada pixel tem 3 bytes (24 bits) para representar a cor RGB 1 byte (8 bits) para vermelho 1 byte (8 bits) para verde 1 byte (8 bits) para azul (Red) (Green) (Blue) Hexadecimal números representados com 0, 1,, 9, A,, F dois dígitos = 16*16 = 256 combinações de 00 a FF 7
Cores 8
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 9
Manipulação do ecrã CPU dá instruções de escrita na RAM de vídeo, normalmente na placa gráfica. 3 bytes por pixel em true color 10
Manipulação do ecrã O controlador do ecrã na placa gráfica actualiza os pixels no ecrã, tipicamente 50 vezes por segundo (ou mais) 11
Gráficos em 2D: plot 12
Gráficos em MATLAB Função plot(x, y, opts) opts é uma string especificando símbolos e cores 13
Gráficos em MATLAB octave:1> x=-pi:0.1:pi; octave:2> y=sin(x); octave:3> plot(x,y,'*-r') octave:4> 14
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> 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> 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. 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> hold on octave:6> plot(x,y,'*-r') octave:7> 17
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 18
Gráficos em MATLAB 19
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. 20
Gráficos em MATLAB mapacores=([1,0,0;0,1,0;0,0,1]) imagem=floor(rand(50)*3)+1; colormap(mapacores) image(imagem) 21
Simulação: difusão 22
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: 23
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) 24
Simulação: difusão 25
Simulação: difusão Para todas as células internas da matriz 26
Percorrer a matriz 27
Percorrer a matriz 28
Simulação: difusão Para todos os vizinhos da célula em (l, c) (excepto o próprio) 29
Percorrer a vizinhança Matriz de 3x3 centrada em (l,c) 30
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. 31
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). 32
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. 33
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 34
Simulação: difusão 35
Simulação: difusão Gradiente de 100 tons de branco até azul 36
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. 37
Simulação: difusão Gota concs=zeros(30); concs(14:16,14:16)=500; difusao(concs,0.1,50); 38
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); 39
Gráficos em MATLAB: 3D 40
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 = y = z = 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 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 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 41
Gráficos em MATLAB x = 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 y = z = 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 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 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 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ção mesh(x,y,z) surf(x,y,z) traça uma rede 3D traça uma superfície 3D 43
Gráficos em MATLAB 44
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 45
Gráficos em MATLAB c=ones(5) c(2,2)=2; c(3,3)=3; colormap([1,0,0;0,1,0;0,0,1]); surf(x,y,z,c) 46
Gráficos em MATLAB Para mudar a orientação: view(azimute, elevação) octave:118> view(45,20) octave:119> view(85,60) 47
Simular um incêndio por Monte Carlo 48
Monte Carlo Nome cunhado pelo matemático Nicholas Constantine Metropolis (1915-1999) Conjunto de métodos baseados em números (pseudo) aleatórios. 49
Simular um incêndio Objectivo Temos uma matriz com a elevação do terreno http://visibleearth.nasa.gov/view.php?id=73934 50
Simular um incêndio Objectivo Queremos simular como um incêndio se propaga no terreno pode haver vento ou outros factores 51
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 52
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 53
Simular um incêndio Simulação probabilidade de propagar o fogo: 0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000 modificada pelo declive somar um factor dependente da diferença de elevação mais provável propagar-se a subir 54
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 55
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) 56
Simular um incêndio Propagar os focos de incêndio 57
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). 58
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. 59
Simular um incêndio Calculamos a probabilidade de propagação modificando o valor da matriz pelo declive (mais provável propagar-se para cima). 60
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 pseudoaleatório entre 0 e 1. 61
Simular um incêndio Extinguir as zonas a arder 62
Simular um incêndio Para simular preparar o gráfico ciclo das iterações propagar extinguir desenhar 63
Simular um incêndio 64
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. 65
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). 66
Simular um incêndio A cada iteração propaga e extingue os fogos activos com as probabilidades respectivas. 67
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) 68
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 69
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 70
Simular um incêndio Declive e vento probpropagar = 0.04000 0.02000 0.04000 0.14000 0.00000 0.14000 0.20000 0.40000 0.20000 efeitodeclive = 0.1 71
Resumindo Gráficos 2D (pontos, linha) plot(vectorx, vectory, opções) hold on hold off clf 72
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) 73
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-plottingfunctions.html Por curiosidade Método Monte Carlo: http://en.wikipedia.org/wiki/monte_carlo_method 74
Dúvidas 75