informática para ciências e engenharias (b) 2015/16
TRANSCRIPT
Na aula de hoje
l Representação de imagens • pixels, sistema RGB
l Gráficos em MATLAB • Gráficos simples • Imagens 2D
• Exemplo: difusão • Gráficos 3D
• Exemplo: simulação estocástica de um incêndio
l (Revisões)
Ecrã, Imagens e Pixels
l Representação de imagens • pixels, sistema RGB
l O ecrã é uma matriz de picture elements (pixels) • a resolução é normalmente indicada pelo seu número de
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
Cores
l 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)
Cores
l “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ã
l CPU dá instruções de escrita
l na RAM de vídeo • normalmente na placa gráfica. • 3 bytes por pixel em “true color”
Manipulação do Ecrã
l O controlador do ecrã na placa gráfica actualiza os pixels no ecrã • tipicamente 50 vezes por segundo
(ou mais)
Gráficos 2D
l Gráficos simples podem ser feitos em MATLAB através da função pre-definida plot.
l function plot(x, y, opts)
• x é um vector com as abcissas • y é um vector com as coordenadas • opts é uma string especificando símbolos e cores
l Nota: Existem várias variantes desta função pré-definida/comando, que podem ser vista do manual.
Gráficos 2D
Exemplo:
l Gráfico do seno
octave:1> x=-pi:0.1:pi; octave:2> y=sin(x); octave:3> plot(x,y,'*-r') octave:4>
Gráficos 2D
Exemplo:
l Gráfico do seno
octave:1> x=-pi:0.1:pi; octave:2> z=-sin(x); octave:3> plot(x,z,’+b') octave:4>
Gráficos 2D
l Hold on • Mantém o gráfico anterior
l Adicionar legendas
octave:1> x=-pi:0.1:pi; octave:2> y=sin(x); octave:3> plot(x,y,'*-r’) octave:4> plot(x,-y,'+b; -seno(x);') octave:5> hold on octave:6> plot(x,y,'*-r; seno(x);’)
Gráficos 2D
l Em resumo: • Gráficos simples podem ser feitos em MATLAB através da
função pre-definida • plot(x, y, opts)
l Para melhorar o aspecto gráfico, podem ainda ser usados os comandos • Title(titulo da imagem); • Xlabel(legenda do eixo dos xx); • Ylabel(legenda do eixo dos yy);
Gráficos 2D
l 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 2D
l “Manchas gráficas” podem ser especificadas em MATLAB através da função pre-definida fill.
l 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
Gráficos 2D
l 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 2D
mapaCores=([1,0,0;0,1,0;0,0,1]) imagem=floor(rand(50)*3)+1; colormap(mapaCores) image(imagem)
Simulação de Difusão
l Vamos simular a difusão de X numa solução (em 2D) • Representação:
• Uma matriz (de pixels) com concentrações • Simulação:
• Discreta: Simular a difusão por passos • Em cada passo de simulação:
• calcular quanto difunde para os 8 vizinhos • Actualizar a matriz de concentrações
Simulação de Difusão
l Vamos simular a difusão de X numa solução (em 2D) • Representação:
• Uma matriz (de pixels) com concentrações • Simulação:
• Discreta: Simular a difusão por passos • 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 de Difusão
l Vamos usar 2 funções :
• é bom ter os cálculos numa parte: function novaConc = passodifusao(matConc, coefDif)
• função para calcular um passo de difusão
• e os gráficos noutra: function difusao(matConcs, coefDif, iteracoes)
• chama a anterior a cada passo e desenha o gráfico
Simulação de 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 de 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 de 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 de Difusão
l testar passodifusao
octave:12> testMat=zeros(5); octave: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 0 0 0 0 0
octave: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 de Difusão
Para cada iteração • calcular um passo de difusão • desenhar a imagem. • comando axis square evita a distorção da imagem • refresh obriga a desenhar o gráfico durante a simulação.
Simulação de Difusão
l Salpicos
concs=zeros(30); concs(2:end-1,2:end-1)=... (rand(28)>0.9)*500; difusao(concs,0.05,100);
Simulação de Difusão
l Gravar o resultado numa série de imagens • Nota: print não faz parte da matéria print(nome) (sprintf veremos mais tarde)
• Na função difusao
for f=0:iteracoes image(matConcs); axis square; refresh; figs = strcat(name,'%03i.png'); print(sprintf(figs,f)); matConcs=passodifusao(matConcs,coefDif); end
Gráficos 3D
l Para fazer um gráfico em 3D precisamos de • Matrizes X, Y
• Formam a “grelha de base” (mesh grid) • Matriz Z
• associa 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
Gráficos 3D
l 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
Gráficos 3D
l Para fazer um gráfico em 3D precisamos de • Matrizes X, Y, Z
• X e Y podem ser criadas com a função meshgrid e.g. [xx,yy] = meshgrid(1:5, 1:5) • Chamar uma das funções
• mesh(x,y,z) traça uma rede 3D • surf(x,y,z) traça uma superfície 3D
Gráficos 3D
l Para fazer um gráfico em 3D ...
• mesh(x,y,z) • traça uma rede 3D
• surf(x,y,z) • traça uma superfície
3D
Gráficos 3D
l 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 3D
c=ones(5) c(1,1)=2; c(4,4)=3; colormap([1,0,0;0,1,0;0,0,1]); surf(x,y,z,c)
Célula (1,1) (cor 2 do color map) Green -[0,1,0])
Célula (4,4) (cor 3 do color map) Blue -[0,0,1])
Gráficos 3D
l Para mudar a orientação: • view(azimute, elevação)
• azimute e elevação em graus • por omissão: • Azimute = -37.5º • Elevação = 30º
Gráficos 3D
l Para rodar o ponto de vista: • Com os ponteiros do relógio: aumentar azimute
>> view(-20,+30)
• Contra os ponteiros do relógio: diminuir azimute
>> view(-60,+30)
Gráficos 3D
l Para variar a elevação: • Ver mais “de baixo”: diminuir o ângulo de elevação
>> view(-37.5,+15)
• Ver mais “de cima”: aumentar o ângulo de elevação
>> view(-37.5,+90)
Simulação de um Incêndio
l Objectivo • Modelando a elevação do terreno com uma matriz 3D • Queremos simular como um incêndio se propaga no terreno
• Considerando alguns factores • Pode haver vento • O declive pode fazer diferença
Simulação de um Incêndio
l 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 • do declive, • do vento, • ...
Simulação de um Incêndio
l Simulação • numa matriz, cada célula indica que a vegetação está
• 1- normal • 2- queimada • 3- a arder
• a probabilidade de propagar o fogo a cada vizinho pode ser dada por • uma matriz de 3x3 (pontos cardiais e colaterais) • assim podemos simular vento ou outros factores
dando valores diferentes para direcções diferentes • modificada pelo declive
Simulação de um Incêndio
l 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.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000
Simulação de um Incêndio
l 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
Simulação de um Incêndio
l 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)
Para todas as células internas da matriz que estejam a arder. Nota: Não queremos propagar as da fronteira para evitar sair dos limites da matriz).
Para todos os vizinhos por arder dessa célula. Nota: não precisamos excluir a própria célula porque essa está a arder.
Calculamos a probabilidade de propagação modificando o valor da matriz pelo declive Nota: mais provável propagar-se para cima.
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.
Simulação de um Incêndio
l Para simular • preparar o gráfico • ciclo das iterações
• propagar • extinguir • desenhar
Simulação de um Incêndio
Cria a matriz com o estado inicial da vegetação do mesmo tamanho da matriz com a elevação do terreno. Podia ser: ones(size(mapa,1),size(mapa,2)) Depois inicia o incêndio.
Simulação de 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).
Simulação de um Incêndio
A cada iteração propaga e extingue os fogos activos com as probabilidades respectivas.
Simulação de 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)
Simulação de um Incêndio
probPropagar = 0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000 efeitoDeclive = 0
l Sem vento nem declive
Simulação de um Incêndio
probPropagar = 0.10000 0.14000 0.10000 0.14000 0.00000 0.14000 0.10000 0.14000 0.10000 efeitoDeclive = 0.1
l Sem vento mas com declive
Simulação de um Incêndio
l Com vento e declive
probPropagar = 0.04000 0.02000 0.04000 0.14000 0.00000 0.14000 0.20000 0.40000 0.20000 efeitoDeclive = 0.1
Resumo
l Gráficos 2D (pontos, linha) • plot(vectorX, vectorY, opções) • hold on, hold off • Clf
l Imagens 2D (pontos, linha) • fill(coordsX, coordsY ,corRGB) • colormap(matrizCoresRGB) • image(matrizIndicesCores)
Resumo
l Gráficos 3D • meshgrid(x,y), • mesh ou surf (x,y,z), ou (x,y,z,c) • view(azimute, elevação)
Para estudar esta aula
l Manual Octave • Capítulo 15, plotting
l MATLAB plotting functions • http://www.mathworks.com/help/matlab/creating_plots/using-
high-level-plotting-functions.html
l Por curiosidade (para a próxima aula) • Método Monte Carlo: • http://en.wikipedia.org/wiki/Monte_Carlo_method