Informática para Ciências e Engenharias 2014/15 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
Ecrã, imagens e pixels
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
A imagem
Pixels representam caracteres
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 Hexadecimal (Red) (Green) (Blue) números representados com 0, 1,, 9, A,, F dois dígitos = 16*16 = 256 combinações de 00 a FF
Cores
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
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
Manipulação do ecrã O controlador do ecrã na placa gráfica actualiza os pixels no ecrã, tipicamente 50 vezes por segundo (ou mais)
Gráficos em 2D: plot
Gráficos em MATLAB Função plot(x, y, opts) opts é uma string especificando símbolos e cores
Gráficos em MATLAB octave:1> x=-pi:0.1:pi; octave:2> y=sin(x); octave:3> plot(x,y,'*-r') octave:4>
Gráficos em MATLAB octave:1> octave:2> octave:3> octave:4> octave:5> x=-pi:0.1:pi; y=sin(x); plot(x,y,'*-r') plot(x,-y,'+b')
Gráficos em MATLAB octave:1> octave:2> octave:3> octave:4> octave:5> x=-pi:0.1:pi; y=sin(x); plot(x,y,'*-r') plot(x,-y,'+b') 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.
Gráficos em MATLAB octave:1> octave:2> octave:3> octave:4> octave:5> octave:6> octave:7> x=-pi:0.1:pi; y=sin(x); plot(x,y,'*-r') plot(x,-y,'+b') hold on plot(x,y,'*-r')
Gráficos em MATLAB Função fill(vx, vy, vcor) vx vy vcor vector com coordenadas x de 4 pontos vector com coordenadas y de 4 pontos vector com 3 valores RGB, entre 0 e 1
Gráficos em MATLAB
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.
Gráficos em MATLAB mapacores=([1,0,0;0,1,0;0,0,1]) imagem=floor(rand(50)*3)+1; colormap(mapacores) image(imagem)
Simulação: difusão
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:
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 Condição fronteira (não há 8 vizinhos) As células nos extremos são constantes (há alternativas, como usar uma fronteira periódica)
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)
Simulação: difusão
Simulação: difusão Para todas as células internas da matriz
Percorrer a matriz
Percorrer a matriz
Simulação: difusão Para todos os vizinhos da célula em (l, c) (excepto o próprio)
Percorrer a vizinhança Matriz de 3x3 centrada em (l,c)
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.
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).
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.
Simulação: difusão octave-3.6.4.exe:12> testmat=zeros(5); octave-3.6.4.exe:13> testmat(3,3)=1 testmat = 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 testar passodifusao 0 0 0 0 0 octave-3.6.4.exe:14> tesmat=passodifusao(testmat,0.1) tesmat = 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.05000 0.10000 0.05000 0.00000 0.00000 0.10000 0.40000 0.10000 0.00000 0.00000 0.05000 0.10000 0.05000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
Simulação: difusão
Simulação: difusão Gradiente de 100 tons de branco até azul
Simulação: difusão Para cada iteração calcular um passo de difusão e desenhar a imagem. O comando axis square força os eixos iguais e o refresh obriga a desenhar o gráfico durante a simulação.
Simulação: difusão Gota concs=zeros(30); concs(14:16,14:16)=500; difusao(concs,0.1,100);
Simulação: difusão Gota concs=zeros(30); concs(14:16,14:16)=500; difusao(concs,0.1,100);
Simulação: difusão Salpicos concs=zeros(30); concs(2:end-1,2:end-1)=... (rand(28)>0.9)*500; difusao(concs,0.05,100);
Simulação: difusão Salpicos concs=zeros(30); concs(2:end-1,2:end-1)=... (rand(28)>0.9)*500; difusao(concs,0.05,100);
Simulação: difusão (print não faz parte da matéria) Para gravar o resultado como uma série de imagens print(nome) (sprintf veremos mais tarde) Na função difusao
Gráficos em MATLAB: 3D
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 = 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 = 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 5 7 9 4 7 4 10 6 3 1 1 7 6 7 5 8 10 7 7 3 10 6 5 2 9
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 = 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 = 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 5 7 9 4 7 4 10 6 3 1 1 7 6 7 5 8 10 7 7 3 10 6 5 2 9
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
Gráficos em MATLAB
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
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)
Gráficos em MATLAB Para mudar a orientação: view(azimute, elevação) octave:118> view(45,20) octave:119> view(85,60)
Gráficos em MATLAB view(10,30)
Gráficos em MATLAB view(15,30)
Gráficos em MATLAB view(20,30)
Gráficos em MATLAB view(20,15)
Gráficos em MATLAB view(20,35)
Gráficos em MATLAB view(20,90)
Simular um incêndio
Simular um incêndio Objectivo Temos uma matriz com a elevação do terreno http://visibleearth.nasa.gov/view.php?id=73934
Simular um incêndio Objectivo Queremos simular como um incêndio se propaga no terreno pode haver vento ou outros factores
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
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
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
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
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)
Simular um incêndio Propagar os focos de incêndio
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).
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.
Simular um incêndio Calculamos a probabilidade de propagação modificando o valor da matriz pelo declive (mais provável propagar-se para cima).
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.
Simular um incêndio Extinguir as zonas a arder
Simular um incêndio Para simular preparar o gráfico ciclo das iterações propagar extinguir desenhar
Simular um incêndio
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.
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).
Simular um incêndio A cada iteração propaga e extingue os fogos activos com as probabilidades respectivas.
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)
Simular um incêndio Sem vento nem declive probpropagar = 0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 efeitodeclive = 0 0.10000 0.14000 0.10000
Simular um incêndio Só declive probpropagar = 0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 efeitodeclive = 0.1 0.10000 0.14000 0.10000
Simular um incêndio probpropagar = 0.04000 0.14000 0.20000 0.02000 0.00000 0.40000 efeitodeclive = 0.1 0.04000 0.14000 0.20000 Declive e vento
Resumindo Gráficos 2D (pontos, linha) plot(vectorx, vectory, hold on hold off clf opções)
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, declinacao)
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
Dúvidas