79
Informática para Ciências e Engenharias (B) 2015/16 Teórica 6

Informática para Ciências e Engenharias (B) 2015/16

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Informática para Ciências e Engenharias (B)

2015/16

Teórica 6

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

Ecrã, imagens e pixels Ecrã, imagens e pixels

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

Imagem e Pixels

Imagens e Pixels

l  Caracteres são representados por 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

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

Gráficos em MATLAB: 2D Ecrã, imagens e pixels

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

Exemplo:

l  Juntar gráficos

octave:3> plot(x,y,'*-r') octave:4> plot(x,z,’+b')

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

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

Exemplo 1: Simulação de Difusão (em 2D)

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

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

Simulação de Difusão

Para todas as células (l,c) internas da matriz

Simulação de Difusão

Matriz de 3x3 centrada em (l,c)

Simulação de Difusão

Para todos os vizinhos da célula em (l, c) excepto o próprio)

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

Simulação de Difusão

Gradiente de 100 tons de branco até azul

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  Gota

concs=zeros(30); concs(14:16,14:16)=500; difusao(concs,100);

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

Gráficos em MATLAB: 3D

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

Exemplo 2: Simulação de um Incêndio (em 3D)

Simulação de um Incêndio

l  Objectivo •  Modelando a elevação do terreno com uma matriz 3D

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)

Simulação de um Incêndio

l  Propagar os focos do incêndio

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  Extinguir as zonas a arder

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

l  Simular o incêndio

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

Dúvidas ?