Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
VOLTADOS AO
PROCESSAMENTO DE IMAGENS
EM MATLAB
2015/1
1
1 INTRODUÇÃO
1
Isso não impossibilita que o usuário também possa fazer procedimentos matemáticos simples ou vetoriais.
2
1.1 Inicialização do MATLAB
1.2 Comandos
A partir desse ponto, o MATLAB espera as instruções do usuário. Para inserir uma matriz
pequena, por exemplo, pode-se digitar:
>> A = [1 2 3; 4 5 6; 7 8 9]
colocando-se colchetes em volta dos números e separando as linhas por ponto e vírgula.
Quando se pressiona a tecla <Enter> o MATLAB responde com:
2
O software está pronto para receber comandos quando no canto inferior esquerdo aparece a mensagem
“Ready”. Quando ele está inicializando ou executando algum comando aparece “busy” e o usuário deve
aguardar.
3
A variável “A” aparece no workspace. É importante ressaltear que todas as variáveis
(imagens, por exemplo) a serem futuramente trabalhadas devem constar no workspace.
Para fazer uma operação aritmética simples, o usuário pode teclar:
>> soma = 5 + 2
soma = 7
A variável “soma” aparece no workspace para uso futuro.
3
Imagine quando um procedimento realizado com uma imagem de milhões de pixels é executado sem ponto-e-
vírgula? Todos os pixel serão mostrados na tela dificultando a visualização.
4
ou simplesmente
>> expressão
A avaliação das expressões produzem matrizes, que são então mostradas na tela e
atribuídas às variáveis para uso futuro. Se o nome da variável e o sinal de igualdade "=" são
omitidos, a variável com o nome ans, que representa a palavra "answer" (resposta), é
automaticamente criada. Por exemplo, digite a expressão:
>> 1900 / 81
que produz:
Ans = 23.4568
Ou alternativamente:
>> V = 1900 / 81
que produz:
V = 23.4568
É importante observar que se outro comando for dado sem atribuição inicial a
nenhuma variável, o valor antigo de “ans” será substituído pelo novo.
Se a expressão é tão grande que não cabe em apenas uma linha, pode-se continuar a
expressão na próxima linha usando um espaço em branco e reticencias, ( ... ), ao final das
linhas incompletas. Por exemplo:
>> S = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - 1/10 + 1/11 - 1/12 + 1/3 - 1/4 . . .
>> - 1/8 + 1/9 - 1/10 + 1/11 - 1/12 + 1/13;
calcula o resultado da série, atribuindo o somatório à variável “S”, mas não imprime o
resultado na tela, isto porque adicionou-se um ‘ ; ‘ ao final da expressão. Note que os espaços
em branco entre os sinais ‘=’, ‘+’ e "-" são opcionais, mas o espaço em branco entre "1/4" e
"..." é obrigatório.
As variáveis e funções podem ser formadas por um conjunto de letras, ou por um
conjunto de letras e números, onde somente os primeiros 19 caracteres do conjunto são
identificados. O MATLAB é case-sensitive, isto é, faz distinção entre letras maiúsculas e
minúsculas, assim a e A não são as mesmas variáveis. Todas as funções devem ser escritas
em letras minúsculas: inv(A) calcula a inversa de A, enquanto INV(A) é uma função
indefinida, não existe.
Execute algumas expressões como:
>> A = 5 + 2
>> B = A + 3
>> C = A + B;
>> D = B / C
>> P = (10*A) – (2 / C)*3
Note que todas as novas variáveis criadas vão sendo automaticamente salvas no
workspace. Experimente também criar algumas matrizes:
M = [ 1 2 3; 4 5 6; 7 8 9]
5
N = [ 1 1 1; 2 2 2; 3 3 3]
A notação decimal convencional com ponto decimal opcional e o sinal de menos é usada
para números (observe que um números com virgulas, assim como nas calculadoras, são
representados com ponto). A potência de dez pode ser incluída como um sufixo. A seguir são
mostrados alguns exemplos de números aceitos:
3 -99 0.00001
9.6374586 1.602E-20 6.06375e23
1 ^ Exponenciação
3 / Divisão a direita
4 \ Divisão a esquerda
5 * Multiplicação
6 + Adição
7 - Subtração
Deve-se notar que existem dois símbolos para divisão: as expressões 1/4 e 4\1 possuem o
mesmo valor numérico, isto é, 0,25. Parênteses são usados em sua forma padrão para
delimitar a atuação dos operadores aritméticos. Não existem colchetes e chaves, apenas
parênteses em diversos níveis.
2 FUNÇÕES
6
‘.m’ criados a partir das funções intrínsecas4. A biblioteca externa pode ser constantemente
atualizada à medida que novas aplicações são desenvolvidas por você.
As categorias gerais de funções matemáticas disponíveis no MATLAB incluem:
matemática elementar;
matemática avançada;
matrizes elementares;
matrizes especiais;
decomposição e fatoração de matrizes;
polinômios;
solução de equações diferenciais;
equações não-lineares e otimização;
derivação e integração numérica;
análise de dados;
análise estatística;
ferramentas para mapas
processamento de sinais;
processamento de imagens.
4
Estas funções são criadas por desenvolvedores profissionais e atualizadas a cada nova versão do MATLAB.
7
aplicações. Um dos principais motivos da utilização do MATLAB por diversos segmentos da
ciência e do mercado de trabalho voltado à utilização de imagens é a qualidade e utilidade do
toolbox de processamento de imagens. Seguem abaixo alguns exemplos de comandos básicos
desta toolbox:
imread = (‘filename’, ‘fmt’) lê uma imagem do arquivo especificado pelo nome
do arquivo string.
Se o arquivo não está na pasta atual (aquela cujo caminho foi apontado em current folder), ou
em uma pasta no caminho MATLAB, especificar o caminho completo
((‘C:/Arquivos/.../filename’, ‘fmt’)). É possível também abrir uma imagem
simplesmente arrastando o arquivo para dentro do workspace com maior facilidade.
O fmt especifica o formato do arquivo, sua extensão de arquivo padrão. Por exemplo,
especifique 'gif' para arquivos de formato Graphics Interchange. Existe uma lista de
formatos suportados, com suas extensões de arquivo, digite imformats para conhecer.
O valor de retorno A é uma matriz que contém os dados de imagem importada para o
workspace do MATLAB. Se o arquivo contém uma imagem em tons de cinza, A é uma matriz
M-por-N, onde M é o número de linhas e N o número de colunas da imagem. Se o arquivo
contém uma imagem truecolor (com cores vermelho, verde e azul5), A é uma matriz M-por-N-
por-3. Se o arquivo for uma imagem de satélite, por exemplo, que possui mais de 3 camadas,
A é uma matriz M-por-N-por-K, sendo K o número de camadas.
3 CLASSES DE DADOS
Assim que a imagem é aberta no workspace do MATLAB, é possível verificar a classe dos
dados do arquivo. Pixels são geralmente representadas por números inteiros e positivos, ou
5
(RED, GREEN e BLUE).
6
Também chamada de Níveis de Cinza ou Monocromática.
8
seja, 1, 2, 3, 4, 5, e assim por diante. Essa formatação dos dados confere um tamanho menor
ao arquivo que contém a imagem. Por exemplo, se a imagem tem 8 bits, significa que 28 =
256 e ela poderá assumir apenas 256 níveis diferentes de coloração (de 0 até 255)7, ou níveis
de cinza entre o branco puro e o preto puro. Imagens de Sensoriamento Remoto usualmente
possuem 8 bits. Se a imagem possuir 16 ou 24 bits, seus níveis de cinza conterão 216 = 65536
e 224 = 167772168, respectivamente. Obviamente a imagem contará com um detalhamento
maior, mas o tamanho computacional de cada pixel aumentará de acordo o seu valor em bits.
Esse valor (8, 16, 24) é conhecido como a resolução radiométrica da imagem. O MATLAB
representa essa estruturação de dados por uint8 (Inteiros 8 bits) ou uint16 (Inteiros 16 bits),
por exemplo.
7
Onde 0 representa o preto e 255 representa o branco.
8
Nesse caso, 0 representa o preto e 16777216 representa o branco.
9
processamento de imagens é muito comum trabalhar com os dados na classe double, uma vez
que esta classe permite a manipulação completa dos dados sem restrições. Portanto, essa é a
classe de dados que devemos trabalhar em PDI9. A figura abaixo mostra a origem dessas
classes dentro do conjunto matemático dos números:
double (x) : Converte os dados (x) de qualquer classe para a classe double, números
fracionários positivos ou negativos.
uint8(x): Converte os dados (x) de qualquer classe para a classe uint8, inteiros
positivos de 0 a 255.
uint16 (x): Converte os dados (x) de qualquer classe para a classe uint16, inteiros
positivos de 0 a 65536
Ao mesmo tempo que é importante trabalhar com as imagens no formato double dentro do
MATLAB, é necessário converter a mesma para uint8 ao final dos processos antes de gravar.
Assim, outros softwares poderão ler a imagem processada sem maiores problemas.
Muito importante:
Ao visualizar alguma imagem na tela, a função imshow(img) pode variar dependendo do tipo
de classe da imagem. Por exemplo, para o MATLAB, se a imagem estiver na classe uint8,
entende-se que ela possui valores variando de 0 até 255, e a função imshow desta imagem
mostrará o valor 0 como preto e o valor 255 como branco. Os demais valores intermediários
receberão diferentes níveis de cinza de acordo com o seu valor. Se por acaso a imagem
possuir a classe double, a função imshow mostrará o valor 0 como preto, e o valor 1 como
branco. Os demais valores fracionários entre 0 e 1 receberão diferentes níveis de cinza.
9
Acostume-se a sempre que abrir a imagem no workspace transformar ela para class double.
10
Qualquer pixel com valor menor que 0 ficará preto, assim como qualquer pixel com valor
maior que 1 ficará branco. Assim, ao converter uma imagem de uint8 para double, deve-se
tomar o cuidado de dividir seus valores por 255 (valor máximo da classe uint8). Dessa forma,
todos os valores da imagem ficarão entre 0 e 1, e quando a imagem for apresentada na tela por
imshow apresentará os valores corretos de níveis de cinza. Caso essa divisão por 255 não seja
feita, pixels com valores maiores que 1 ficarão brancos (ou seja, muitos pixels na imagem).
IMPORTANTE: Se "A" for uma imagem de intensidade de cinzas ou uma imagem colorida
(RGB) de classe <uint8>, imwrite grava os valores reais da matriz no arquivo. Se "A" for da
classe <double>, imwrite redimensiona os valores da matriz antes de gravá-los, usando
uint8(round(255*A)). Esta operação converte os números de ponto-flutuante na faixa [0,1] em
inteiros de 8 bits na faixa [0,255].
10
Se for imagem 8 bits 28 = 256.
11
Onde usam-se penas valores inteiros.
11
Figura 4.1 Convenção dos eixos para representação de imagens digitais
12
Figura 4.2 (a) imagem digital com grupo de pixels selecionados; (b) zoom da janela de
9x9 pixels; (c) valor dos contadores digitais da função f(x, y). Fonte: CEPSRM-UFRGS.
13
Figura 4.3 Exemplo de Histograma de Imagem.
As imagens obtidas por sensores eletrônicos, em diferentes canais, são formadas por
níveis de cinza (imagens monocromáticas). A quantidade de energia refletida pelos objetos
vai determinar a intensidade dos níveis de cinza entre o branco (quando refletem toda a
energia) e o preto (quando absorvem toda a energia). Ao combinar as imagens
monocromáticas produzidas por cada banda através das cores azul, verde e vermelho (cores
primárias), é possível gerar imagens ou composições coloridas. Nas imagens coloridas, a cor
de um objeto vai depender da quantidade de energia por ele refletida nas faixas espectrais de
cada uma das bandas selecionadas para visualização.
Figura 4.4 Imagem colorida, obtida a partir das imagens ETM+ LANDSAT-7, dos
canais 1, 2 e 3, com as cores azul, verde e vermelho. Fonte: FLORENZANO (2002)
14
Figura 4.5 Imagem colorida, obtida a partir das imagens ETM+ LANDSAT-7, dos
canais 3, 4 e 5, com as cores azul, verde e vermelho. Fonte: FLORENZANO (2002)
6 REFERÊNCIAS
FLORENZANO, Tereza Gallotti. Imagens de satélites para estudos ambientais. São Paulo: Oficina de
Textos, 2002.
CROSTA, Álvaro Penteado - Processamento Digital de Imagens de Sensoriamento Remoto. Ed. Rev. -
Campinas, SP: IG/UNICAMP, 1993.
16
Histograma da Imagem
O histograma de uma imagem fornece informação útil para fazer realce e análise da
imagem. O histograma de uma imagem revela a distribuição dos níveis de cinza da imagem. É
representado por um gráfico que dá o número de pixels na imagem para cada nível de cinza.
» a =imread('baronesa.jpg');
17
O resultado e mostrado na FIGURA 03 (Museu da Baronesa - Pelotas/RS).
» imhist(a);
Realce
O objetivo principal das técnicas de realce é processar uma imagem, de modo que o
resultado seja mais apropriado para uma aplicação específica do que a imagem original [1].
As Técnicas de realce podem ser baseadas em processamento ponto-a-ponto, que modifica o
nível de cinza de um pixel independentemente da natureza de seus vizinhos, ou pelo processo
de filtragem, onde o novo valor depende também dos valores dos pontos vizinhos do ponto a
ser processado.
Contraste
18
A manipulação do contraste de uma imagem tem como objetivo melhorar a sua qualidade
visual sob critérios subjetivos ao olho humano. Esse processo não aumenta a quantidade de
informação contida na imagem, mas torna mais fácil a sua percepção. É normalmente
utilizada como uma etapa de pré-processamento.
O contraste de uma imagem pode ser avaliado observando-se o seu histograma. Uma
imagem com bom contraste possui um histograma cujas barras são razoavelmente espalhadas
ao longo de todo o intervalo da escala. Por exemplo, a imagem da Figura 05 (Mercado
Público - Pelotas/RS) e seu histograma (Figura 06). Já o histograma mostrado na Figura 08
tem uma forma estreita que indica uma escala dinâmica pequena , isto porque corresponde a
uma imagem de baixo contraste.
19
visualização que, geralmente, é [0, 255]. Vmin e Vmax são os valores de níveis de cinza
mínimos e máximos, respectivamente, presentes na imagem original.
y =f(x)
A escolha da função f determina qual será o efeito visual obtido, e deve ser escolhida de
acordo com a imagem original e o efeito desejado. Em uma transformação linear, os valores
de níveis de cinza dos pixels são escalonados de tal forma que todos os pixels com valores
Vmin e Vmax são mapeados para 0 e 255, respectivamente. Da mesma forma, os outros
valores de níveis de cinza são mapeados para valores entre 0 e 255.
Quando muitos valores de intensidade na imagem original são mapeados para o valor
mínimo ou máximo na imagem original diz-se que, ocorreu uma saturação (overflow) e uma
perda de informação, pois os pixels que originalmente podiam ser diferenciados na imagem
original agora possuem o mesmo valor de intensidade.
No entanto isto pode ser um efeito desejado, por exemplo, quando as regiões escuras da
imagem com pequenas variações radiométricas correspondem a áreas com o mesmo tipo de
cobertura as quais não se deseja diferenciar.
Uma função linear também utilizada é a função negativa. Ela realiza o mapeamento
inverso dos níveis de cinza, revertendo a ordem do preto para o branco, de tal forma que
pixels com intensidade clara serão mapeados para escuro e vice-versa.
Na equalização de histograma o mapeamento tem por finalidade produzir uma imagem cujo
histograma tenha um formato desejado. A equalização modifica o histograma da imagem
original de tal forma que a imagem transformada tenha um histograma uniforme, ou seja,
todos os níveis de cinza devem aparecer na imagem com a mesma freqüência.
20
Exemplo:
21
Na prática, a obtenção de um histograma perfeitamente uniforme não é possível devido à
natureza das imagens digitais de sensoriamento remoto, cujos pixels podem assumir somente
valores discretos. Existem técnicas para melhorar este problema, mas pode acontecer de áreas
homogêneas na imagem original aparecerem "pipocadas", por que tons de cinza iguais são
mapeados para níveis de cinza diferentes.
22