Introdução ao Octave

43
Processamento de Imagens Aula 03 Octave Professor Dr. Fábio Augusto M. Cappabianco

description

Aula de Introdução ao octave, linguagem interpretada, voltado a processamento de imagens elaborada pelo Prof. Dr. Fábio Cappabianco.

Transcript of Introdução ao Octave

Page 1: Introdução ao Octave

Processamento de Imagens

Aula 03

Octave

Professor Dr. Fábio Augusto M. Cappabianco

Page 2: Introdução ao Octave

Octave 2/43

Roteiro

Terminal Octave.

Comandos sobre arquivos.

Comandos matemáticos básicos.

Comandos de vetores e matrizes.

Comandos lógicos.

Comandos sobre imagens.

Comandos de conversão de tipos.

Funções.

Scripts.

Erros comuns.

Page 3: Introdução ao Octave

Octave 3/43

Instruções

Para aproveitar bem esta aula, siga os slides executando no terminal do Linux e no terminal do Octave os exemplos dados.

Page 4: Introdução ao Octave

Octave 4/43

Terminal Octave (1)

Para abrir um terminal do octave basta abrir um terminal do Linux, acessar a pasta onde você deseja trabalhar e executar o comando:

> octave

Page 5: Introdução ao Octave

Octave 5/43

Terminal Octave (2)

Para sair do octave de volta para o terminal do Linux, basta digitar a palavra 'quit' ou a palavra 'exit'

octave:1> exit

ou

octave:1> quit

O comando 'help <cmd>' imprime na tela a documentação do comando de nome <cmd>. Esta documentação explica como o comando deve ser utilizado.

Exemplo: Digite no terminal a frase abaixo e veja a documentação do comando exit.

octave:1> help exit

Page 6: Introdução ao Octave

Octave 6/43

Terminal Octave (3)

O comando 'lookfor <str>' procura pela string <str> dentro da primeira linha da descrição dos comandos e funções padrão do Octave.

O comando 'lookfor -all <str>' busca a string <str> em todo texto dos comandos e das funções.

Exemplo: digite no terminal do Octave:

octave:1> lookfor help

Page 7: Introdução ao Octave

Octave 7/43

Comandos Sobre Arquivos (1)

Alguns comandos sobre o sistema de arquivos do Octave são iguais aos comandos utilizados pelo terminal do Linux.

Teste o resultado dos seguintes comandos:

Comando para listar conteúdo da pasta atual.

octave:1> ls

Comando para exibir qual é a pasta atual.

octave:2> pwd

Comando para subir um nível em uma pasta:

octave:3> cd ..

Comando para descer para uma pasta de nome <p>:

octave:4> cd <p>

Page 8: Introdução ao Octave

Octave 8/43

Comandos Sobre Arquivos (2)

Comando para limpar a tela:

Mantenha a tecla Ctrl pressionada e aperte a tecla l.

Comando para minimizar/maximizar a janela (no Ubuntu)

Mantenha a tecla Alt pressionada e aperte a tecla F10.

Outra alternativa para sair do Octave:

Mantenha a tecla Ctrl pressionada e aperte a tecla D.

Page 9: Introdução ao Octave

Octave 9/43

Comandos Matemáticos Básicos (1)

Digite um número no terminal do Octave e este número será repetido no terminal:

Exemplo: octave:1> 3

Digite uma operação aritmética no terminal do Octave tela e o resultado será impresso:

Exemplo: octave:1> 3 + 5

Exemplo: octave:2> 4 / 9

Exemplo: octave:3> 4 * 4

Exemplo: octave:4> 9 ** 2

Page 10: Introdução ao Octave

Octave 10/43

Comandos Matemáticos Básicos (2)

Existem também algumas funções e constantes pré-definidas para operações matemáticas mais complexas:

Exemplos:

> sin( 1 )

> cos( 2.1 )

> tan( pi / 4 )

> exp( 3.2 )

Caso tenha dúvidas de como uma dastas funções ou contantes esteja declarada leia o help da função.

Exemplos:

> help cot

> help tand

Page 11: Introdução ao Octave

Octave 11/43

Comandos Matemáticos Básicos (3)

No Octave, não é necessário declarar variáveis. Quando você quiser utilizar uma variável, basta atribuir para ela um determinado valor.

Exemplos:

> a1 = 4

> i = 15 / 2

As variáveis podem ser alteradas.

Exemplo:

> gu = 3

> gu = gu - 10

Page 12: Introdução ao Octave

Octave 12/43

Comandos Matemáticos Básicos (4)

Os nomes das variáveis podem ser quaisquer palavras compostas por letras maiúsculas e minúsculas, números e o caractere '_'.

Sugiro que os nomes sejam iniciados com letras.

Não utilize o nome de uma constante ou função pré-definida, a não ser que você queira alterar o valor da constante e não utilizar a função.

Page 13: Introdução ao Octave

Octave 13/43

Comandos Matemáticos Básicos (5)

Existem vários tipos de dados no Octave.

O tipo de dado de uma variável será definido pelo primeiro valor atribuído a ela.

No caso de atribuição numérica, como nos exemplos anteriores, o tipo será double.

Existem os tipos escalares:

int8, uint8, int16, uint16, int32, uint32, int64, uint64, double.

Existem ainda números complexos.

Exemplo:

X = 2 + 7.5i

Page 14: Introdução ao Octave

Octave 14/43

Comandos Matemáticos Básicos (6)

Caso você queira que o resultado de uma operação seja atribuído a uma variável, mas que não seja impresso no terminal, acrescente um caractere ';' ao final da operação.

Exemplos:

> a = 3.0;

> b = sin( a );

Para apenas visualizar o valor atual de uma variável, digite o nome dela no terminal.

Exemplo:

> a = 5.5;

> a

Page 15: Introdução ao Octave

Octave 15/43

Comandos de Vetores e Matrizes (1)

Para declarar uma matriz com valores pré-definidos, basta inserir os valores entre colchetes, separando as colunas por ',' e as linhas por ';'.

Exemplo de atribuição de matriz 3x3 pré-definida a uma variável de nome A:

> A = [ 1, 1, 2; 3, 5, 8; 13, 21, 34 ];

É possível também gerar uma matriz de números aleatórios:

Exemplo de atribuição de matriz 2x3x4 aleatória a uma variável de nome B:

> B = rand ( 2, 3, 4 );

Para calcular a matriz transposta de uma matriz A digite:

> C = A'

A matriz inversa é dada por:

> D = inv( A );

ou

> E = A^-1

Page 16: Introdução ao Octave

Octave 16/43

Comandos de Vetores e Matrizes (2)

É possível também resolver sistemas por matrizes com comando x = A \ b, onde A é matriz 2x2 e B é matriz 2x1.

Exemplo:

> A = rand( 2, 2 )

> b = rand( 2, 1 )

> x = A \ b

As operações '+', '-' e '*' executam soma, subtração e multiplicação de matrizes.

Exemplo:

> A = rand( 2, 2 )

> b = rand( 2, 1 )

> C = rand( 2, 2 )

> D = A + C

> E = C – A

> f = A * b

Page 17: Introdução ao Octave

Octave 17/43

Comandos de Vetores e Matrizes (3)

Elementos de um vetor ou matriz podem ser acessado por digitar o nome da variável que contém a matriz e a posição do elementos entre parêntesis, separando as coordenadas de cada dimensão por ','.

As coordenadas são definidas entre 1 e n, onde n é o tamanho da dimensão na coordenada. Se uma ou mais coordenadas forem omitidas, elas terão valor 1.

Exemplo:

> a = rand( 3,2, 2 )

> a( 1, 2, 2 )

> a( 2,1 )

> a( 3 )

Page 18: Introdução ao Octave

Octave 18/43

Comandos de Vetores e Matrizes (4)

Além de obter o valor de uma determinada coordenada, é possível atribuir o um valor para o elemento de uma determinada coordenada de maneira semelhante:

> a = rand( 3, 3 )

> a( 2, 2 ) = 5

Note que se a coordenada for maior que a dimensão da matriz, o Octave automaticamente aumenta o tamanho da matriz em todas as dimensões necessárias para comportar o novo elemento. Os outros elementos acrescentados terão valor 0:

> a = rand( 2 )

> a( 7, 4 ) = 9

Page 19: Introdução ao Octave

Octave 19/43

Comandos de Vetores e Matrizes (5)

É possível também acessar um intervalo ou todos os elementos de uma linha, coluna ou sub-matriz. Veja alguns exemplos:

> v = [ 2, 3, 4, 5, 6 ]

> v( 2 : 4 )

> m = rand( 3, 3 )

> m( :, 1 )

> m( :, 1 : 2 )

> m( 2 : 3, 1 : 2 )

O símbulo ':' indica intervalo. Se nenhum valor for colocado antes ou depois dele, o valor mínimo e máximo, respectivamente, são selecionados.

Page 20: Introdução ao Octave

Octave 20/43

Comandos de Vetores e Matrizes (6)

Muitas vezes as funções pré-definidas do Octave que operam sobre escalares, operam também sobre matrizes e vetores.

Veja alguns exemplos:

> n = rand( 10, 1 )

> sin( n )

> m = rand( 3, 3 )

> exp( m )

Como veremos adiante, esta regra normalmente se aplica também a funções desenvolvidas pelo usuário.

Page 21: Introdução ao Octave

Octave 21/43

Comandos de Vetores e Matrizes (7)

Algumas funções interessantes para manipulação de matrizes e vetores são:

rows: retorna o número de linhas de uma matriz.

columns: retorna o número de colunas de uma matriz.

length: retorna o comprimento de um vetor.

max: retorna o máximo valor máximo de um vetor.

Para retornar o valor máximo de uma matriz 2D de nome mat, basta utilizar o comando:

max( max( mat ) )

sum: retorna a somatória dos elementos de um vetor.

Para retornar a somatória dos valores de uma matriz 2D de nome mat, basta utilizar o comando:

sum( sum( mat ) )

Page 22: Introdução ao Octave

Octave 22/43

Comandos Lógicos (1)

Os comandos for, while, do-until, if-else, switch-case são funções de repetição e condicionais. Utilize o comando 'help' para ver a sintaxe de cada um deles.

Eles podem ser utilizados para percorrer os elementos de vetores e matrizes e para avaliar condições de desvio e atribuição.

Exemplo de impressão de números pares entre 0 e 50:

> s = 0;

> do

> if( mod( s, 2 ) == 0 )

> s

> endif;

> s++;

> until( s > 4 );

Page 23: Introdução ao Octave

Octave 23/43

Comandos Lógicos (2)

Exemplo de percorrer um vetor aleatório e imprimir apenas os números menores que 0.5 e inverter os demais números:

> n = rand( 10, 1 )

> for s = 1:10

> if( n(s) < 0.5 )

> n( s )

> else

> n( s ) = 1 / n( s );

> endif

> endfor

Page 24: Introdução ao Octave

Octave 24/43

Comandos sobre Imagens (1)

Existem diversos tipos de imagens sobre as quais o Octave trabalha. Por exemplo, png, pgm, jpg, gif.

Para ler uma imagem de um arquivo basta executar o comando:

> img = imread( “<nome_do_arquivo>” );

Neste caso, img receberá uma matriz contendo a informação de cada pixel da imagem aberta, sendo 2D para imagens em tons de cinza e 3D para imagens coloridas.

Os dados da matriz serão do tipo uint8, e não double, como na atribuição de valores escalares.

Tente abrir alguma imagem em um dos formatos citados pelo comando imread.

Page 25: Introdução ao Octave

Octave 25/43

Comandos sobre Imagens (2)

Para que o Octave exiba uma imagem que está em uma matriz de nome img, execute o comando imshow.

Exemplo:

> img = imread( “vegetables.jpg” );

> imshow( img );

Tente abrir uma imagem e visualizá-la pelo Octave.

Page 26: Introdução ao Octave

Octave 26/43

Comandos sobre Imagens (3)

Finalmente, é possível salvar uma imagem contida em uma matriz de nome img em um arquivo de nome resultado.jpg pelo comando imwrite.

Exemplo:

imwrite( img, “resultado.jpg” );

Tente abrir uma imagem pelo comando imread e salvá-la pelo comando imwrite.

Page 27: Introdução ao Octave

Octave 27/43

Comandos sobre Imagens (4)

Para realizar processamentos sobre os dados de uma imagem, basta percorrer seus elementos e alterar os seus valores.

Note, porém, que algumas funções do Octave requerem que o dado utilizado seja do tipo double.

Neste caso é necessário a conversão de dados entre os tipos uint8 e double.

Page 28: Introdução ao Octave

Octave 28/43

Comandos de Conversão de Tipos (1)

Para converter um dado de um tipo para outro, basta chamar uma função definida pelo nome do tipo desejado.

Conversão de imagem armazenada em matriz de nome img para números reais:

> img = imread( “minha_imagem.jpg” );

> img = double( img );

Conversão de matriz real de nome result para inteira sem sinal de 8 bits:

> result = uint8( result );

Page 29: Introdução ao Octave

Octave 29/43

Comandos de Conversão de Tipos (2)

Dependendo de como uma matriz é inicializada, cada elemento pode ser considerado pelo Octave como um vetor de uma unidade de números reais, ao invés de um simples escalar inteiro. Isto pode resultar em alguns erros, ao executar as funções imshow e imwrite.

Caso este seja o caso em uma matriz de nome result, tente o seguinte procedimento:

> result = single( uint8( result ) );

Este comando fará todas as conversões necessárias para escalares inteiros sem sinal de 8 bits.

Page 30: Introdução ao Octave

Octave 30/43

Comandos de Conversão de Tipos (3)

Existem ainda outros tipos de dados como strings, listas de strings, registros e arrays de células.

As strings podem ser utilizadas para imprimir textos para o usuário, muito embora não sejam comumente convertidas para números.

Listas de strings são uma sequência de strings. Elas são acessadas pelo nome da lista e entre chaves o elemento da lista.

Exemplo: s{ 2 }

Registros são estruturas de dados muito parecidas com resgistros em C.

Arrays de células são semelhantes a arrays, mas podem possuir em cada posição um tipo de dado diferente.

Os tipos registro e array de células estão fora do escopo deste curso.

Page 31: Introdução ao Octave

Octave 31/43

Funções (1)

Além de utilizar funções do Octave, podemos também instanciar nossas próprias funções.

As funções em Octave possuem um nome podem ter vários parâmetros e valores de retorno.

Veremos também como escrever funções em arquivos para que elas possam ser carregadas toda vez que inicializarmos o terminal do Octave.

O ideal é que as suas funções sejam agrupadas em arquivos por alguma semântica, facilitando o seu uso e documentação.

Page 32: Introdução ao Octave

Octave 32/43

Funções (2)

Veja um exemplo de uma função simples, sem parâmetros e sem retorno:

> function hello( )

> printf( "Hello, World!\n" );

> endfunction

A função printf funciona de maneira praticamente igual à função de mesmo nome em C.

Page 33: Introdução ao Octave

Octave 33/43

Funções (3)

Veja um exemplo de uma função com um parâmetro e sem retorno:

> function hello2( who = "World" )

> printf( "Hello, %s!\n", who );

> endfunction

A função possui um parâmetro do tipo string chamado who, com valor padrão igual a “World”.

Page 34: Introdução ao Octave

Octave 34/43

Funções (4)

Veja um exemplo de uma função f com um parâmetro x e uma variável de retorno y:

> function y = f( x )

> y = x ** 2;

> endfunction

Esta função recebe parâmetros de qualquer tipo numérico e retorna o seu quadrado. Caso x seja uma matriz quadrada, a função retornará a multiplicação de x por x. Caso seja uma matriz não quadrada, um erro irá ocorrer.

Page 35: Introdução ao Octave

Octave 35/43

Funções (5)

Veja um exemplo de uma função vmax com um parâmetro de entrada v e duas variáveis de retorno retorno m e i.

v é um vetor, m retorna o maior valor de v e i retorna o índice do maior valor.

> function[ m, i ] = vmax( v )

> i = 1;

> m = v( i );

> for j = 2:length( v )

> if( v( j ) > m )

> m = v( j );

> i = j;

> endif

> endfor

> endfunction

Page 36: Introdução ao Octave

Octave 36/43

Funções (6)

A utilização de funções escritas pelo usuário é feita da mesma forma que as funções primitivas do Octave.

Veja exemplos de como chamar as funções instanciadas nos slides anteriores:

> hello( )

> hello2( )

> hello2( “People” )

> b = f( 4 )

> x = [ 1, 2, 3, 4, 5 ];

> [ m, I ] = vmax( x )

Note que a função vmax requer duas variáveis de retorno. Elas são especificadas entre colchetes e separadas por vírgulas.

Page 37: Introdução ao Octave

Octave 37/43

Funções (7)

Como dito anteriormente, é melhor que as funções criadas sejam gravadas em um arquivo.

Um arquivo com funções pode ser carregado utilizando-se o comando source.

> source( “meu.m” );

Exemplo:

Crie um arquivo de nome teste.m e salve-o na pasta de trabalho do Octave.

Escreva algumas funções dentro deste arquivo.

Carregue o arquivo pelo comando source.

Execute alguma das funções contidas em teste.m.

Page 38: Introdução ao Octave

Octave 38/43

Scripts (1)

Outra opção que o Octave oferece é de escrever arquivos de script que podem ser executados diretamente do terminal do Linux.

Um arquivo de script do Octave é um arquivo texto pode ter qualquer extensão.

Um arquivo de script de Octave sempre começa com o comando:

#! /usr/bin/octave -qf

Depois, ele pode conter declaração de funções e a execução de uma sequência de comandos desejada.

Exceto no caso da primeira linha, o símbolo '#' corresponde a um comentário.

Page 39: Introdução ao Octave

Octave 39/43

Scripts (2)

Alguns comandos só funcionam em scripts como é o caso dos comandos abaixo:

A função scanf( ) funciona de maneira semelhante ao scanf da linguagem C, mas retorna o valor lido, ao invés de armazená-lo em um endereço passado como arqumento. O segundo arqumento do scanf é o número de vezes que o valor será lido.

> a = scanf( “%d”, 1 );

A função program_name( ) retorna o nome do script.

A variável nargin contém o número de parâmetros entrados ao executar o script.

A função argv( ) retorna uma lista de strings contendo os parâmetros entrados para executar o script.

Page 40: Introdução ao Octave

Octave 40/43

Scripts (3)

Veja um exemplo de um script que utiliza alguns dos comandos anteriores:

#! /usr/bin/octave -qf

printf ( "%s", program_name( ) );

arg_list = argv( );

for i = 1:nargin

printf ( " %s", arg_list{ I } );

endfor

printf ( "\n" )

Page 41: Introdução ao Octave

Octave 41/43

Scripts (4)

Outro exemplo de programa, agora que utiliza a função scanf e que contém um comentário:

#! /usr/bin/octave -qf

# um comentario!!!

who = scanf( "%s", 1 );

printf( "Hello %s!\n", who );

Exercício: Crie um arquivo para cada um dos scripts dados e execute-os pelo terminal do Linux.

Você precisa ter permissão para executar um arquivo pelo terminal do Linux.

Assim, acesse a pasta onde você escreveu o arquivo de script e antes de executá-lo execute o seguinte comando.

chmod +x <nome_do_arquivo>

Page 42: Introdução ao Octave

Octave 42/43

Erros Comuns (1)

Existem dois tipos de erros no Octave: os erros de sintaxe, que ocorrem quando você escreve alguma palavra errada e os erros de execução, quando não é possível executar uma função ou operação, muito embora não haja erro de sintaxe.

Um erro de sintaxe simples é dado por executar o comando:

> a = b *** 3

Neste caso, o Octave indicará que houve erro de sintaxe e pode até mesmo apontar o local de onde o erro ocorreu.

Page 43: Introdução ao Octave

Octave 43/43

Erros Comuns (2)

Os erros de execução geralmente são mais difíceis de se encontra do que os de sintaxe, pois sua mensagem nem sempre é fácil de compreender.

Um exemplo de erro de sintaxe é a execução abaixo:

> a = [ 2, 3 ]

> b = a * a;

Este erro ocorre porque o número de colunas de a teria de ser igual ao de linhas, para que a multiplicação de matrizes fosse possível.

O código abaixo gera um erro semelhante, mas é mais fácil de se identificar.

> a = [ 2, 3 ]

> b = a ** 2;