Buscar

Livro cap traduzido

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 1/17
Página 1
Antevisão
Conforme mencionado no capítulo anterior, o poder que o MATLAB traz para cavar
O processamento de imagens ital é um extenso conjunto de funções para o processamento de
matrizes mensionais das quais as imagens (matrizes numéricas bidimensionais) são um
caso especial. A Image Processing Toolbox (IPT) é uma coleção de funções
que estendem a capacidade do ambiente de computação numérica MATLAB.
Essas funções, e a expressividade da linguagem MATLAB, fazem
muitas operações de processamento de imagem fáceis de escrever de maneira compacta e clara,
proporcionando assim um ambiente de prototipagem de software ideal para a solução de
problemas de processamento de imagem. Neste capítulo, apresentamos os fundamentos do MAT-
Notação LAB, discuta uma série de propriedades e funções fundamentais do IPT,
e introduzir conceitos de programação que aumentam ainda mais o poder do IPT.
Assim, o material neste capítulo é a base para a maior parte do material em
o restante do livro.
Representação de imagem digital
Uma imagem pode ser definida como uma função bidimensional, f (x, y), onde x e
y são coordenadas espaciais (planos), e a amplitude desligada em qualquer par de coordenadas
nates (x, y) é chamado de intensidade da imagem naquele ponto. O termo nível cinza
é freqüentemente usado para se referir à intensidade de imagens monocromáticas. Imagens coloridas são
formado por uma combinação de imagens 2-D individuais. Por exemplo, no RGB
sistema de cores, uma imagem colorida consiste em três (vermelho, verde e azul)
imagens componentes. Por este motivo, muitas das técnicas desenvolvidas para
imagens monocromáticas podem ser estendidas para imagens coloridas, processando os três
imagens componentes individualmente. O processamento de imagens coloridas é tratado em detalhes em
Capítulo 6.
2.1 uma Representação Digi
Uma imagem pode ser contínua em relação às coordenadas xey, e
também em amplitude. Converter essa imagem em formato digital requer que o
coordenadas, bem como a amplitude, ser digitalizado. Digitalizando a coordenada
os valores são chamados de amostragem; a digitalização dos valores de amplitude é chamada de
Assim, quando x, y e os valores de amplitude desligados são todos finitos, quantidades discretas
chamamos a imagem de imagem digital.
2-3.1 Convenções de Coordenadas
O resultado da amostragem e quantização é uma matriz de números reais. Nós usamos
duas maneiras principais neste livro de representar imagens digitais. Suponha que um
a imagem f (x, y) é amostrada de modo que a imagem resultante tenha M linhas e N
colunas. Dizemos que a imagem tem o tamanho M x N. Os valores do coordi-
nates (x, y) são quantidades discretas. Para maior clareza e conveniência da notação, nós
use valores inteiros para essas coordenadas discretas. Em muitos processamento de imagem
livros, a origem da imagem é definida como em (x, y) = (0, O). A próxima coordenada
os valores ao longo da primeira linha da imagem são (x, y) = (0, l). É importante
tenha em mente que a notação (O, 1) é usada para significar a segunda amostra ao longo
a primeira linha. Isso não significa que estes são os valores reais de co-
ordena quando a imagem foi amostrada. A Figura 2.l (a) mostra esta coordenada
convenção. Observe que x varia de-0 a M - 1, ey de 0 a N - 1, em in-
incrementos de teger.
A convenção de coordenadas usada na caixa de ferramentas para denotar matrizes é diferente
do parágrafo anterior em duas pequenas maneiras. Primeiro, em vez de usar (x, y),
a caixa de ferramentas usa a notação (r, c) para indicar linhas e colunas. Nota, como-
sempre, que a ordem das coordenadas é a mesma que a ordem discutida no
parágrafo anterior, no sentido de que o primeiro elemento de uma tupla de coordenadas,
(a, b), refere-se a uma linha e o segundo a uma coluna. A outra diferença é que
a origem do sistema de coordenadas está em (r, c) = (1, l); assim, r varia de 1 a
M e c de 1 a N, em incrementos de números inteiros. Esta convenção de coordenadas é
mostrado na Fig. Zl (b).
M - 1,
................................
..........
............
................. M
1
Um pixel > ""X
..........
..................................
T
Um pixel >r
Página 2
1 Capítulo 2 e fundamentos
A documentação do IPT refere-se às coordenadas na Fig. 2.l (b) como pixel coordi-
nates. Com menos frequência, a caixa de ferramentas também emprega outra convenção de coordenação
ção chamada de coordenadas espaciais, que usa x para se referir a colunas ey para se referir
às linhas. Isso é o oposto de nosso uso das variáveis x e y. Com muito poucos ex-
percepções, não usamos a convenção de coordenadas espaciais do IPT neste livro, mas
o leitor certamente encontrará a terminologia na documentação do IPT.
2.12 Imagens como matrizes
O sistema de coordenadas na Fig. 2.l (a) e a discussão anterior levam ao
seguinte representação para uma função de imagem digitalizada:
f (0, l) ... f (0, N-1) 1
O lado direito desta equação é uma imagem digital por definição. Cada elemento de
essa matriz é chamada de elemento de imagem, elemento de imagem, pixel ou pel. Os termos
imagem e pixel são usados em todo o resto de nossas discussões para denotar um
2.2 @! L
Formato Reconhecido
Nome Descrição Extensões
TIFF Formato de arquivo de imagem marcada . tlf, .tiff
JPEG Joint Photographic Experts Group . j pg ,. Eu pego
GIF Graphics Interchange orm mat ^ . glf
BMP Bitmap do Windows . bmp
PNG Gráficos Portáteis de Rede .Prig
XWD X Window Dump . xwd
'GIF é suportado por lmread, mas não por lmwrite.
Aqui, nome do arquivo é uma string contendo o nome completo do arquivo de imagem (in-
incluindo qualquer extensão aplicável). Por exemplo, a linha de comando
lê a imagem chestxray JPEG (Tabela 2.1) na imagem array f. Observe o uso
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 2/17
'ATLAB e IPT
uso de documentação
a matriz de termos
array arrd , principalmente em
cambiavelmente. Como-
, er, tenha em mente
zt a matrir é dois
nensional, enquanto
array urt pode ter
sua dimensão finita.
imagem digital e seus elementos.
Uma imagem digital pode ser representada naturalmente como uma matriz MATLAB:
onde f (1 , 1) = f (0, O) (observe o uso de uma fonte monoespaçada para denotar MAT-
Quantidades LAB). Claramente, as duas representações são idênticas, exceto para o
mudança na origem. A notação f ( p, q) denota o elemento localizado na linha p e
coluna q. Por exemplo, f (6, 2 ) é o elemento na sexta linha e na segunda coluna
umn da matriz f. Qpicamente usamos as letras M e N, respectivamente, para de-
observe o número de linhas e colunas em uma matriz. Uma matriz 1 x N é chamada de
vetor linha, enquanto uma matriz M x 1 é chamada de vetor coluna. Um 1 x 1 matriz seja
um escalar.
As matrizes no MATLAB são armazenadas em variáveis com nomes como A, a, RGB,
matriz real e assim por diante. As variáveis devem começar com uma letra e conter apenas
letras, numerais e sublinhados. Conforme observado no parágrafo anterior, todos
As quantidades do MATLAB neste livro são escritas usando caracteres monoespaços. Nós
use a notação romana convencional em itálico, como f (x, y), para matemática
expressões.
Lendo Imagens
As imagens são lidas no ambiente MATLAB usando a função imread,
cuja sintaxe é
de aspas simples (') para delimitar o nome do arquivo da string. O ponto e vírgula no finalde uma linha de comando é usado pelo MATLAB para suprimir a saída. Se um ponto e vírgula
não está incluído, o MATLAB exibe os resultados das operações especificadas em
aquela 1 linha. O símbolo de prompt (>> I designa o início de uma linha de comando, -, # ~ R
como aparece na janela de comando do MATLAB (consulte a Fig. 1.1).
Quando, como na linha de comando anterior, nenhuma informação de caminho é incluída no
nome do arquivo, imread lê o arquivo do diretório atual (consulte a Seção 1.7.1)
e, se isso falhar, ele tenta encontrar o arquivo no caminho de pesquisa do MATLAB (ver
Seção 1.7.1). A maneiramais simples de ler uma imagem de um diretório especificado são as p
para incluir um caminho completo ou relativo para esse diretório em nome de arquivo. Por exem
lê a imagem de uma pasta chamada myimages na unidade D: enquanto
lê a imagem do subdiretório myimages do diretório de trabalho atual
reitoria. A janela do diretório atual na barra de ferramentas da área de trabalho do MATLAB
exibe o diretório de trabalho atual do MATLAB e fornece um man-
ual maneira de mudar isso. A Tabela 2.1 lista algumas das imagens gráficas mais populares
formatos suportados por imread e imwrite (imwrite é discutido em
Seção 2.4).
O tamanho da função fornece as dimensões da linha e coluna de uma imagem:
>> tamanho (f)
ans =
Página 316 Capítulo 2 a Fundamentos
Tamanho 1s 117 , ~ nnj ~ y
MATLA B rrrlrl IPT
Iinctiorls carr reexecutada
mais de um em
utr urgunzenr. Multi-
de saída
irylrrnenrs nzrrst be
-rrclosed dentro
quore bmckets, []
eu eu
o que
* / \
1 " '
J rmshow
Esta função é particularmente útil na programação quando usada nas seguintes
formulário para determinar automaticamente o tamanho de uma imagem:
>> [M, N] = tamanho (f);
Esta sintaxe retorna o número de linhas (M) e colunas (N) na imagem.
A função whos exibe informações adicionais sobre uma matriz. Para ...
postura, a declaração
>> quem f
dá
Nome Tamanho Bytes aula
f 1024x1 024 1048576 matriz uint8
O total geral é de 1048576 elementos usando 1048576 bytes
A entrada uint8 mostrada se refere a uma das várias classes de dados do MATLAB dis-
discutido na Seção 2.5. Um ponto e vírgula no final de uma linha de quem não tem efeito, então
normalmente um não é usado.
Exibindo Imagens
As imagens são exibidas na área de trabalho do MATLAB usando a função imshow, que
tem a sintaxe básica:
onde f é uma matriz de imagem, e G é o número de níveis de intensidade usados para dis-
Jogue. Se G for omitido, o padrão é 256 níveis. Usando a sintaxe
imshow (f, [baixo alto])
exibe em preto todos os valores menores ou iguais a baixo, e em branco todos os valores
maior ou igual a alto. Os valores intermediários são exibidos como
valores de intensidade de diate usando o número padrão de níveis. Finalmente, a sintaxe
define a variável baixa para o valor mínimo da matriz f e alta para seu máximo
valor. Esta forma de imshow é útil para exibir imagens que têm um baixo índice
faixa dinâmica ou que tenham valores positivos e negativos.
A função pixval é usada frequentemente para exibir os valores de intensidade de indi-
pixels virtuais interativamente. Esta função exibe um cursor sobreposto a um
imagem. Conforme o cursor é movido sobre a imagem com o mouse, o coordi-
dados da posição do cursor e os valores de intensidade correspondentes são
2.3 iPB Exibin
mostrado em uma tela que aparece abaixo da janela da figura. Quando se trabalha
com imagens coloridas, as coordenadas, bem como as composições de vermelho, verde e azul
nents são exibidos. Se o botão esquerdo do mouse for clicado e mantido
pressionado, o pixval exibe a distância euclidiana entre o inicial e o
alugar locais do cursor.
A forma de sintaxe de interesse aqui é
pixval
que mostra o cursor na última imagem exibida. Clicar no botão X em
a janela do cursor o desliga.
il (a) As seguintes instruções lêem do disco uma imagem chamada rose-51 2. tif, EXEMPLO
extraia informações básicas sobre a imagem e exiba-as usando imshow:
>> f = imread ('rose-512.tif1);
>> quem f
Nome Tamanho Bytes Aula
f 512x512 262 144 matriz uint8
O total geral é de 262144 elementos usando 262144 bytes
Um ponto e vírgula no final de uma linha imshow não tem efeito, então normalmente é
não usado. A Figura 2.2 mostra a aparência da saída na tela. A figura
número aparece na parte superior esquerda da janela. Observe os vários pull-down
menus e botões de utilitários. Eles são usados para processos como dimensionamento, economia
e exportar o conteúdo da janela de exibição. Em particular, o menu Editar
tem funções para editar e formatar os resultados antes de serem impressos ou
salvo no disco.
Página 4
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 3/17
3 Capítulo 2 B FLI
figura rncrion
~ (come afigllre wln-
'7 ~. Wl ~ en usado
itholrt an argll-
~ ttt, ns sho ~ u ~ z aqui,
? implica cria ti
,, cw, + ig ~ cre window.
- digitando figura (n),
Irces, número da figura
, o se torna vrsível.
b
GURE 2.3 (a) An
\ age, h, com baixo
faixa dinâmica.
J) Resultado da escala
usando imshow
I, [ ]). (Original
cortesia da idade de
7r. David R.
ickens, Dept.
Radiologia e
adiológico
Ciências, Vanderbilt
lniversity Medical
: nter.)
Se outra imagem. g, é exibido usando imshow, MATLAB substitui o
imagem na tela com a nova imagem. Para manter a primeira imagem e produzir um
segunda imagem, usamos a figura de função da seguinte maneira:
>> figura, imshow (g)
Usando a declaração
>> imshow (f), figura, imshow (g)
exibe ambas as imagens. Observe que mais de um comando pode ser escrito em um
linha, desde que os diferentes comandos sejam devidamente delimitados por vírgulas ou semi-
dois pontos. Como mencionado anteriormente, um ponto-e-vírgula é usado sempre que se deseja substituir
pressione as saídas da tela a partir de uma linha de comando.
(b) Suponha que acabamos de ler uma imagem he descobrimos que usando imshow (h)
produz a imagem da Fig. 2.3 (a). É claro que esta imagem tem um baixo dinamismo
intervalo, que pode ser remediado para fins de exibição usando a instrução
A Figura 2.3 (b) mostra o resultado. A melhora é aparente. R
Gravando Imagens
As imagens são gravadas no disco usando a função imwrite, que tem o seguinte
sintaxe básica:
imwrite (f, 'nome do arquivo')
Com esta sintaxe, a string contida no nome do arquivo deve incluir um reconhecido
extensão de formato de arquivo (consulte a Tabela 2.1). Alternativamente, o formato desejado pode ser
especificado explicitamente com um terceiro argumento de entrada. Por exemplo, o seguinte
comando grava f em um arquivo TIFF denominado paciente lo-run1 :
>> imwrite (f, 'patientlo-runl', 'tif')
ou, alternativamente,
2,4 E
~ f nome do arquivo não contém informações de caminho, então o imwrite salva o arquivo no
diretório de trabalho atual.
A função imwrite pode ter outros parâmetros, dependendo do arquivo para-
tapete selecionado. A maior parte do trabalho nos capítulos seguintes lida com
Imagens JPEG ou TIFF, portanto, focamos a atenção aqui nesses dois formatos.
Uma sintaxe imwrite mais geral aplicável apenas a imagens JPEG é
imwrite (f, 'nomedoarquivo.jpgl,' qualidade ', q)
onde q é um número inteiro entre 0 e 100 (quanto menor o número, maior o
degradação devido à compressão JPEG).
A Figura 2.4 (a) mostra uma imagem, f, típica de sequências de imagens resultantes EXEM
a partir de um determinado processo químico. Deseja-se transmitir essas imagens em um rotead
base para um local central para inspeção visual e / ou automatizada. Para e usando
reduzir o tempo de armazenamento e transmissão, é importante que as imagens sejam com-
pressionado tanto quanto possível, sem degradar sua aparência visual
além de um nível razoável. Neste caso, "razoável" significa não perceptível
contorno falso. As Figuras 2.4 (b) a (f) mostram os resultados obtidos por escrito
imagem f para o disco (em formato JPEG), com q = 50,25,15,5 e 0, respectivamente
ly. Por exemplo, para q = 25 a sintaxe aplicável é
>> imwrite (f, 'bubbles25.jpg1,' quality ', 25)
A imagem para q = 15 [Fig. 2.4 (d)] tem contorno falso que é quase invisível,
mas este efeito torna-se bastante pronunciado para q = 5 e q = 0. Assim, um
solução aceitável com alguma margem de erro é compactar as imagens com
q = 25. Para se ter uma ideia da compressão alcançada e obter outras
detalhes do arquivo de imagem, podemos usar a função imf inf o, que tem a sintaxe
nome do arquivo imfinfo
onde nome do arquivo é o nome completo do arquivo da imagem armazenada no disco. Para
exemplo,
>> imfinfo bubbles25.jpg
produz as seguintes informações (observe que alguns campos não contêm informações
ção neste caso):Nome do arquivo :
FileModDate:
Tamanho do arquivo :
Formato :
Versão do formato :
Largura:
Altura :
BitDepth :
ColorType:
Formatsignature:
Comentário :
'bubbles25.jpg1
'04 -Jan-2003 12:31:26 '
13849
'jpg'
II
71 4
682
8
'grayscale'
3 0
{ 1
Página 520 Capítulo 2 n Fundamentos 2.4 a Grav
FIGURA 2.4
(a) Orlginal ~ rnage
(b) através
(f) Resultados do uso
Valores de qualidade J pg
q = 50,25. 15,5.
e 0, respectivamente
Contorno falso
começa a ser apenas
perceptível para
q = 15 [imagem (d)]
mas 1s bastante vlslble
para q = 5 e
q = 0
Veja o Exemplo 2.11
para afr ~~ zctiorz que
creares NIL as imagens
na Fig. 2.4 usando um
simples para loop.
cátion. Além das vantagens óbvias no espaço de armazenamento, esta redução
permite a transmissão de aproximadamente 35 vezes a quantidade de
dados pressionados por unidade de tempo.
Os campos de informação exibidos pelo imf info podem ser capturados em um
chamada de variável de estrutura que pode ser usada para cálculos subsequentes. Usando
a imagem anterior como exemplo, e atribuindo o nome K à estrutura
variável, usamos a sintaxe
para armazenar na variável K todas as informações geradas pelo comando imfinf o.
A informação gerada pelo imfinfo é anexada à variável de estrutura
por meio de campos, separados de K por um ponto. Por exemplo, a altura da imagem
e largura agora são armazenados nos campos de estrutura K. Altura e K. Largura.
Como ilustração, considere o seguinte uso da variável de estrutura K para com-
calcule a taxa de compressão para as bolhas25. j pg:
>> K = imfinfo ('bubbles25.jpg');
> r bytes de imagem = K.Width * K.Height * K.BitDepth / a;
>> bytes compactados = K.FileSize;
>> compressão-razão = imagem-bytes / compressed_bytes
taxa de compressão =
35,1612
Observe que o imfinfo foi usado de duas maneiras diferentes. O primeiro era digitar
bolhas do imfinfo25. jpg no prompt, o que resultou na informação
sendo exibido na tela. A segunda era digitar K = imfinfo ( ' bub-
bles25. j pg ' ) , que resultou na informação gerada pelo irnf info
sendo armazenados em K. Estas duas maneiras diferentes de chamar imfinfo são um exemplo
da dualidade comando-função, um conceito importante que é explicado em mais
detalhes na documentação online do MATLAB.
Uma sintaxe imwrite mais geral aplicável apenas a imagens tif tem a forma
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 4/17
onde FileSize está em bytes. O número de bytes na imagem original é com-
colocado simplesmente multiplicando Width por Height por BitDepth e dividindo o
resultado por & O resultado é 486948. Dividindo isso por FileSize dá a compressão
proporção de ação: (486948113849) = 35,16. Esta taxa de compressão foi alcançada
ao mesmo tempo em que mantém a qualidade da imagem consistente com os requisitos do aplicativo
imwrite (g, 'nomedoarquivo.tifl,' compressão ',' parâmetro ', ...'resolução', [colres rowres])
onde ' parâmetro' pode ter um dos seguintes valores principais: ' nenhum '
indica nenhuma compressão; ' packbit s ' indica compressão de packbits (o
padrão para imagens não binárias); e ' ccitt ' indica compressão ccitt (o
padrão para imagens binárias). O array 1 X 2 [colres rowres] contém dois in ~ nd ~ cat, que
tegers que fornecem a resolução da coluna e a resolução da linha em pontos por unidade (o * turml
os valores padrão são [72 721). Por exemplo, se as dimensões da imagem são em polegadas, não há
Colres é o número de pontos (pixels) por polegada (dpi) na direção vertical, entre tizeprrrocls
e da mesma forma para rowres na direção horizontal. Especificando a resolução
por um único escalar, res, é equivalente a escrever [res res].
Página 6
2 Capítulo 2 Fundamentos do ifi
'XAMPLE 2.3: 1 A Figura 2.5 (a) é uma imagem de raio-X de 8 bits de uma placa de circuito gerada durante
'cantar lmwrite inspeção de qualidade. Está em formato jpg, a 200 dpi. A imagem é do tamanho
irameters. 450 x 450 pixels, então suas dimensões são 2,25 x 2,25 polegadas. Queremos armazenar
esta imagem em formato tif, sem compressão, com o nome sf. Além disso,
queremos reduzir o tamanho da imagem para 1,5 X 1,5 polegadas, mantendo o
contagem de pixels em 450 x 450. A seguinte declaração produz o resultado desejado:
Os valores do vetor [colres rowres] foram determinados pela multiplicação
200 dpi pela proporção 2,25 / 1,5, o que dá 300 dpi. Em vez de fazer o computador
ção manualmente, poderíamos escrever
Redondo >> res = redondo (200 * 2,25 / 1,5);
>> imwrite (f, 'sf.tifl,' compressão ',' nenhum ',' resolução1, res)
onde a função round arredonda seu argumento para o inteiro mais próximo. É importante
É importante notar que o número de pixels não foi alterado por esses comandos.
Apenas a escala da imagem mudou. A imagem original de 450 X 450 a 200 dpi
tem o tamanho de 2,25 X 2,25 polegadas. A nova imagem de 300 dpi é idêntica, exceto que seu
; URE 2,5
Efeitos de
~ anging the dpi
solução enquanto
eping o
.., mber de pixels
"Tnstant.
) A 450 X 450
idade em 200 dpi
ze = 2,25 x
2,25 polegadas).
) O mesmo
Imagem 3 x 450,
t em 300 dpi
,,. ze = 1,5 X
' 5 polegadas).
) imagem rígida
urtese de Lixi.
:.)
Class
450 x 450 pixels são distribuídos em uma área de 1,5 x 1,5 polegadas. Processos como
isso é útil para controlar o tamanho de uma imagem em um documento impresso com
sacrificando a resolução.
Freqüentemente, é necessário exportar imagens para o disco da maneira como aparecem no
Desktop MATLAB. Isso é especialmente verdadeiro com gráficos, como mostrado a seguir
capítulo. O conteúdo de uma janela de figura pode ser exportado para o disco de duas maneiras
A primeira é usar o menu suspenso Arquivo na janela da figura (ver Fig. 2.2)
e escolha Exportar. Com esta opção, o usuário pode selecionar um local, arquivo
nome e formato. Mais controle sobre os parâmetros de exportação é obtido usando
o comando de impressão:
print -fno -dfileformat -rresno nome do arquivo
onde não se refere ao número da figura na janela de figura de interesse,
formato de arquivo refere-se a um dos formatos de arquivo na Tabela 2.1, resno é a resolução
em dpi, e nome do arquivo é o nome que desejamos atribuir ao arquivo. Por exemplo,
para exportar o conteúdo da janela da figura na Fig. 2.2 como um arquivo atif a 300 dpi,
e sob o nome hi-res-rose, digitaríamos
>> imprimir -fl -dtiff -r300 hi-res-rose
Este comando envia o arquivo hi-res-rose. tif para o diretório atual.
Se simplesmente digitarmos print no prompt, o MATLAB imprimirá (para o padrão
impressora) o conteúdo da última janela de figura exibida. Também é possível
especifique outras opções com impressão, como um dispositivo de impressão específico.
Classes de dados
Embora trabalhemos com coordenadas inteiras, os valores dos próprios pixels são
não restrito a números inteiros no MATLAB. A Tabela 2.2 lista as várias classes de dados
suportado por MATLAB e IPT para representar valores de pixel. Os primeiros oito
entradas na tabela são chamadas de classes de dados numéricos . A nona entrada é a
classe char e, como mostrado, a última entrada é referida como a classe de dados lógicos .
Todos os cálculos numéricos no MATLAB são feitos usando quantidades duplas,
portanto, esta também é uma classe de dados frequente encontrada em aplicativos de processam
ções. A classe uint8 também é encontrada com frequência, especialmente durante a leitura
dados de dispositivos de armazenamento, já que imagens de 8 bits são as representações mais c
ções encontradas na prática. Essas duas classes de dados, classe lógica e, para um menor
grau, classe uint 16, constituem as classes de dados primárias nas quais nos concentramos
este livro. Muitas funções IPT, no entanto, suportam todas as classes de dados listadas em
Tabela 2.2. A classe de dados double requer 8 bytes para representar um número, uint8
e inta requerem 1 byte cada, uintl 6 e intl 6 requerem 2 bytes e uint32,
A documentação do MATLAB geralmente usa os termos drrrri clors e llrrra fipr alternadamente. Em deste livro.
reservamos o uso do termo tipo para imagens. conforme discutido na Seção 2.6.Página 724 Capítulo 2 .a Fundamentos 2.7 @ Conversão entre classes de dados e tipos de im
TABELA 2.2
Classes de dados. O
primeiras oito entradas
são referidos como
classes neréricas ;
a nona entrada é
o charncter
aula, e a última
a entrada é da classe
lógico.
Nome Descrição
Duplo Dupla precisão, números flutuantes de polnt no aproximado
intervalo -10 "'~ a (8 bytes por elemento)
uint8 Inteiros de 8 bits sem sinal no intervalo [O, 2551 (1 byte por elemento)
ulntl6 Inteiros de 16 blocos sem sinal no intervalo [O, 655351 (2 bytes por
elemento)
ulnt32 Inteiros de 32 bits sem sinal no intervalo [O, 42949672951 (4 bytes
por elemento)
1nt8 Inteiros de 8-blt com sinal No intervalo [-128,1271 (1 byte por elemento).
inti 6 Inteiros assinados de 16 bits no intervalo [-32768,327671 (2 bytes por
elemento).
int32 Inteiros de 32 bits assinados no intervalo [-2147483648,21474836471
(4 bytes por elemento).
2.4.2 Imagens Binárias
As imagens binárias têm um significado muito específico no MATLAB. Uma imagem binária é
uma matriz lógica de 0s e Is. Assim, uma matriz de 0s e Is cujos valores são de
classe de dados, digamos, uint8. não é considerada uma imagem binária no MATLAB. UMA
array numérico é convertido em binário usando a função lógica. Assim, se A é um
array consistindo em 0s e Is, criamos um array lógico B usando o
demonstração
Se A contém elementos diferentes de 0s e Is, o uso da função lógica con
converte todas as quantidades diferentes de zero para Is lógico e todas as entradas com valor 0 pa
0s. O uso de operadores relacionais e lógicos (consulte a Seção 2.10.2) também cria
matrizes cal.
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 5/17
solteiro Números de ponto flutuante de precisão única com valores nointervalo aproximado -lo3 ' a (4 bytes por elemento).
Caracteres Caracteres (2 bytes por elemento).
lógico Os valores são 0 ou 1 (1 byte por elemento).
int32 e único requerem 4 bytes cada. A classe de dados char contém caracteres
na representação Unicode. Uma string de caracteres é apenas uma matriz 1 x n de caracteres
atores. Uma matriz lógica contém apenas os valores 0 e 1, com cada elemento
sendo armazenado na memória usando um byte por elemento. Matrizes lógicas são tratadas -
ed usando a função lógica (consulte a Seção 2.6.2) ou usando a operação relacional
toros (Seção 2.10.2).
imagem Tipos
A caixa de ferramentas oferece suporte a quatro tipos de imagens:
Imagens de intensidade
Imagens binárias
Imagens indexadas
Imagens RGB
A maioria das operações de processamento de imagens monocromáticas são realizadas usando binários
ou imagens de intensidade, então nosso foco inicial está nesses dois tipos de imagem. Indexado
e imagens coloridas RGB são discutidas no Capítulo 6.
"& . '; Imagens de intensidade
Uma imagem de intensidade é uma matriz de dados cujos valores foram escalados para representar
intensidades. Quando os elementos de uma imagem de intensidade são da classe uint8, ou
classe uint 16, eles têm valores inteiros no intervalo [O, 2551 e [O, 65.5351, re-
espectivamente. Se a imagem for de classe double, os valores serão de vírgula flutuante num-
bers. Os valores das imagens escalonadas, de dupla intensidade de classe estão na faixa [O, 11 por
convenção.
Para testar se um array é lógico, usamos a função islogical:
Se C for uma matriz lógica, esta função retornará 1. Caso contrário, retornará 0. Lógico Consulte a T
arrays podem ser convertidos em arrays numéricos usando a lista de conversão de classe de dad
funções discutidas na Seção 2.7.1.
2.6.3 Uma Nota sobre Terminologia
Um cuidado considerável foi tomado nas duas seções anteriores para esclarecer o uso de
os termos classe de dados e tipo de imagem. Em geral, nos referimos a uma imagem como sendo 
"data-class image-type image", onde data-class é uma das entradas
da Tabela 2.2, e o tipo de imagem é um dos tipos de imagem definidos no início
Ning desta section.Thus, uma imagem é caracterizado por tanto uma classe e um tipo.
Por exemplo, uma declaração discutindo uma "imagem de intensidade de unidade 8" é simplesme
referindo-se a uma imagem de intensidade cujos pixels são da classe de dados unit8. Alguma funç
ções na caixa de ferramentas suportam todas as classes de dados, enquanto outras são muito espec
o que constitui uma classe válida. Por exemplo, os pixels em uma imagem binária podem
ser apenas de classe de dados lógicos, conforme mencionado anteriormente.
Conversão entre classes de dados e tipos de imagem
A conversão entre classes de dados e tipos de imagem é uma operação frequente em
Aplicações IPT . Ao converter entre classes de dados, é importante
tenha em mente os intervalos de valores para cada classe de dados detalhados na Tabela 2.2.
2.7.1 Conversão entre classes de dados
A conversão entre classes de dados é direta. A sintaxe geral é
onde o nome da classe de dados é um dos nomes na primeira coluna da Tabela 2.2.
Por exemplo, suponha que A seja um array da classe uint8. Uma precisão dupla
Página 8
! 6 Capítulo 2 r nentals Funda ~ 2.7 Conversão entre classes de dados e tipos de 
array, B. é gerado pelo comando B = double (A). Esta conversão é usada
rotineiramente ao longo do livro porque o MATLAB espera operandos em nu-
cálculos merical para ser de precisão dupla. Números de ponto flutuante. Se C é um
array da classe double em que todos os valores estão no intervalo [O, 2551 (mas possivelmente
contendo valores fracionários), ele pode ser convertido em uma matriz uint8 com o
comando D = uint8 (C).
Se um array de classe double tem algum valor fora do intervalo [0,255] e é
convertido para a classe uint8 da maneira que acabamos de descrever, o MATLAB converte para
0 todos os valores menores que 0 e converte para 255 todos os valores maiores
de 255. Números intermediários são convertidos em inteiros descartando seus
partes fracionárias. Assim, o dimensionamento adequado de uma matriz dupla para que seus elementos sejam
no intervalo [O, 2551 é necessário antes de convertê-lo para uint8. Conforme indicado em
Seção 2.6.2, convertendo qualquer uma das classes de dados numéricos em resultados lógicos em
uma matriz com Is lógico em locais onde a matriz de entrada tinha valores diferentes de zero,
e 0s lógicos em lugares onde a matriz de entrada continha 0s.
9.7,2 Conversão entre classes e tipos de imagens
Mudança de função t- A caixa de ferramentas fornece funções específicas (Tabela 2.3) que realizam o dimensionamento
moça, discllssedin necessário para converter entre classes e tipos de imagem. Função im2uint8 de-
Seção 3.2.3, pode ser
, sedfo, .c, lnngblgml detecta a classe de dados da entrada e executa todo o escalonamento necessário para o
rpLrrrnzcrgeto (rspec- caixa de ferramentas para reconhecer os dados como dados de imagem válidos. Por exemplo, considere o
ied c [oss. seguinte 2 X 2 imagem f de classe dupla, que poderia ser o resultado de um inter-
mediar computação:
Executando a conversão
produz o resultado
4BLE 2.3
unções no IPT
para converter
Nome Converte a entrada em: Classes de dados de imagem de entrada válidas
im2uint8 uint8 lógico, uint8, uintl6 e duplo
entre a imagem
'burros e tipos.
-e Tabela 6.3 para
a partir da qual vemos que a função im2uint8 define como 0 todos os valores na entrada que
são menores que 0, define como 255 todos os valores na entrada que são maiores que 1, e
multiplica todos os outros valores por 255. Arredondando os resultados da multiplicação para
o inteiro mais próximo completa a conversão. Observe que o comportamento de arredondame
de im2uint8 é diferente da função de conversão de classe de dados uint8 dis-
discutido na seção anterior, que simplesmente descarta as partes fracionárias.
Converter um array arbitrário de class double em um array de class double
scabd para o intervalo [O, 11 pode ser realizado usando a função matzgray
cuja sintaxe básica é
im2uintl6 uintl6 lógico, uint8, uintl6 e duplo
"lat2gray duplo (no intervalo [0, I]) Duplo
L; versões que
especificamente
onde a imagem g tem valores no intervalo de 0 (preto) a 1(branco). O pa especificado
os parâmetros Amin e Amax são tais que os valores menores que Amin em A tornam-se 0 em 
e os valores maiores que Amax em A correspondem a 1 em g. Escrevendo
im2double Duplo lógico, uint8, uintl6 e duplo
im2bw lógico uint8, uintl6 e duplo
define os valores de Amin e Amax para os valores mínimos e máximos reais em
A. Presume-se que a entrada seja de classe dupla. A saída também é de classe dupla.
A função im2double converte uma entrada em classe double. Se a entrada for de
classe uint8, uintl6 ou lógica, a função im2double converte em classe
double com valores no intervalo [0, 11. Se a entrada já for da classe double,
im2double retorna uma matriz que é igual à entrada. Por exemplo, se um array
da classe double resultados de cálculos que geram valores fora do intervalo
[O, 11, inserir esta matriz em im2double não terá efeito. Como mencionado em
o parágrafo anterior, uma matriz dupla com valores arbitrários pode ser con
convertido em uma matriz dupla com valores no intervalo [0, 11 usando a função
mawgray.
COMO ilustração, considere a imagem da classe uint8
1 imagens coloridas.
Executando a conversão
produz o resultado
a partir do qual inferimos que a conversão quando a entrada é da classe uint8 é
feito simplesmente dividindo cada valor da matriz de entrada por 255. Se a entrada for de
classe uintl 6 a divisão é por 65535.
A seção 2.8.2 explica o uso de colchetes e senlicolons para especificar uma matriz.
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 6/17
Página 928 Capítulo 2 ; aii Fundamentos
Finalmente, consideramos a conversão entre os tipos de imagem binários e de intensidade.
Função im2bw, que tem a sintaxe
produz uma imagem binária, g, a partir de uma imagem de intensidade, f, por limiar. O
a imagem binária de saída g tem valores de 0 para todos os pixels na imagem de entrada com
valores de intensidade menores que o limiar T e 1 para todos os outros pixels. O valor que
especificado para T deve estar no intervalo [0, 11, independentemente da classe do
entrada. A imagem binária de saída é declarada automaticamente como uma matriz lógica
por im2bw. Se escrevermos g = im2bw (f), o IPT usa um valor padrão de 0,5 para T. Se
a entrada é uma imagem uint8, im2bw divide todos os seus pixels por 255 e depois ap-
cumpre o padrão ou um limite especificado. Se a entrada for de classe
uintl6, a divisão é por 65535. Se a entrada for uma imagem dupla, im2bw ap-
cumpre o padrão ou um limite especificado diretamente. Se a entrada for um
matriz lógica, a saída é idêntica à entrada. Uma matriz lógica (binária)
pode ser convertido em uma matriz numérica usando qualquer uma das quatro funções em
a primeira coluna da Tabela 2.3.
EXEMPLO 2.4: a (a) Queremos converter a seguinte imagem dupla
Convertendo
entre a imagem
classes e tipos. > ' = [ ; 41
para binário de forma que os valores 1 e 2 se tornem 0 e os outros dois valores se tornem
1. Primeiro, convertemos para o intervalo [0, 11:
Em seguida, o convertemos em binário usando um limite, digamos, de valor 0,6:
2.7 @ Conversão entre classes de dados e tipos de im
COMO mencionado na Seção 2.5, podemos gerar uma matriz binária diretamente usando re-
operadores nacionais (Seção 2.10.2). Assim, obtemos o mesmo resultado escrevendo
Nós poderia armazenar em uma variável (digamos, VBG) o fato de que gb é uma matriz lógica p
usando a função islogical, da seguinte maneira:
>> gbv = islogical (gb)
gbv =
1
(b) Suponha agora que queremos converter gb em uma matriz numérica de 0s e
É de classe dupla. Isso é feito diretamente:
>> gbd = im2double (gb)
gbd =
0 0
1 1
Se gb fosse um array numérico da classe uint8, aplicando im2double a ele
teria resultado em uma matriz com valores
porque im2double teria dividido todos os elementos por 255. Isso não
acontecer na conversão anterior porque im2double detectou que o
entrada era uma matriz lógica, cujos únicos valores possíveis são 0 e 1. Se a entrada
na verdade era uma matriz numérica uint8 e queríamos convertê-la em classe
duplo, mantendo os valores 0 e 1, teríamos convertido a matriz
por escrito
>> gbd = double (gb)
gbd =
Página 10
80 Capítulo 2 B Fundamentos
Por fim, ressaltamos que o MATLAB oferece suporte a instruções aninhadas, portanto, poderíamos ter
começou com a imagem f e chegou ao mesmo resultado usando a instrução de uma linha
>> gbd = im2double (im2bw (mat2gray (f), 0,6));
ou usando agrupamentos parciais dessas funções. Claro, todo o processo
poderia ter sido feito neste caso com um comando mais simples:
>> gbd = duplo (f > 2);
demonstrando novamente a compactação da linguagem MATLAB. B
Array Indexing
O MATLAB suporta uma série de esquemas de indexação poderosos que simplificam
manipulação de array e melhorar a eficiência dos programas. Nesta seção nós
discutir e ilustrar a indexação básica em uma e duas dimensões (ou seja, vetores
e matrizes). Técnicas mais sofisticadas são introduzidas conforme necessário no sub
discussões subsequentes.
2.8,? 1 Indexação de vetor
Conforme discutido na Seção 2.1.2, uma matriz de dimensão 1 X N é chamada de linha vec-
tor. Os elementos de tal vetor são acessados usando um índice unidimensional
ing. Assim, v (1 ) é o primeiro elemento do vetor v, v (2) seu segundo elemento, e assim
para frente. Os elementos dos vetores no MATLAB são colocados entre colchetes
e são separados por espaços ou vírgulas. Por exemplo,
2.8 a In
Para acessar blocos de elementos, usamos a notação de dois pontos do MATLAB . Para a pro
ple, para acessar os primeiros três elementos de v , escrevemos
1 3 5
Da mesma forma, podemos acessar o segundo ao quarto elemento
3 5 7
ou todos os elementos, digamos, do terceiro ao último elemento:
5 7 9
onde fim significa o último elemento do vetor. Se v for um vetor, escrever
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 7/17
>> v = [13579]
v =
1 3 5 7 9
>> v (2)
ans =
smg um único qiiote
durante todo o período
~ ornputes [ele conju-
7te transpor. Quando
Os dados são reais, ambos
rnsposes podem ser
ed inrerchangenably.
.we Tabela 2.4.
5
Um vetor linha é convertido em um vetor coluna usando o operador transpor ( . ' ):
>> w = v. '
W =
1
3
5
7
9
produz um vetor coluna, enquanto a escrita
produz um vetor linha.
A indexação não se restringe a elementos contíguos. Por exemplo,
>> V (l: 2: fim)
1 5 9
A notação 1 : 2: fim diz para começar em I, contar até 2 e parar quando a contagem
atinge o último elemento. As etapas podem ser negativas:
>> v (fim: -2: l)
9 5 1
Página 1132 Chopter 2 a Fundamentals
Aqui, a contagem do índice começou no último elemento, diminuiu em 2 e parou
quando atingiu o primeiro elemento.
Função linspace, com sintaxe
. linspace
gera um vetor linha x de n elementos espaçados linearmente entre e incluindo
a e b. Usamos essa função em vários lugares em capítulos posteriores.
Um vetor pode até ser usado como um índice em outro vetor. Por exemplo, nós
pode escolher o primeiro, quarto e quinto elementos de v usando o comando
>> v ([l 4 51)
ans =
1 7 9
Conforme mostrado na seção a seguir, a capacidade de usar um vetor como um índice para
outro vetor também desempenha um papel fundamental na indexação da matriz.
2,8.2 Indexação de matriz
As matrizes podem ser representadas convenientemente no MATLAB como uma sequência de linha
vetores delimitados por colchetes e separados por ponto e vírgula. Para a prova-
ple, digitando
exibe a matriz 3 X 3
Observe que o uso de ponto e vírgula aqui é diferente do uso mencionado na orelha
lier para suprimir a saída ou para escrever vários comandos em uma única linha.
Selecionamos elementos em uma matriz assim como fizemos para vetores, mas agora precisamos
dois índices: um para estabelecer uma localização de linha e outro para o correspondente
coluna ing. Por exemplo, para extrair o elemento na segunda linha, terceira coluna
umn. nós escrevemos
>> A (2, 3)
ans =
6
2.8 B Arr
O operador de dois pontos é usado na indexação da matriz para selecionar um operador bidimenbloco de elementos de uma matriz. Por exemplo,
Aqui, o uso do cólon por si só é análogo a escrever A ( 1 : 3,3), que simplesmente
escolhe a terceira coluna da matriz. Da mesma forma, extraímos a segunda linha como
segue:
A declaração a seguir extrai as duas linhas principais:
Para criar uma matriz B igual a A, mas com sua última coluna definida como Os, escrevemos
As operações de uso final são realizadas de maneira semelhante aos exemplos
fornecido na seção anterior para indexação de vetor. Os exemplos a seguir ilustram
trate isso.
>> A (fim, fim)
ans =
9
Página 12
4 Capítulo 2 Fundamentos
>> A (fim, fim - 2)
ans =
7
ans =
2.8 M A
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 8/17
6 4
9 7
O uso de vetores para indexar em uma matriz fornece uma abordagem poderosa para elementos
seleção de ment. Por exemplo,
A notação A ( [ a b] , [ c d]) seleciona os elementos em A com coordenadas
(linha a, coluna c), (linha a, coluna d), (linha b, coluna c) e (linha b, coluna
d). Assim, quando deixamos E = A ( [ 1 31 , [2 31) , estamos selecionando o seguinte elemento
mentos em A: o elemento na linha 1, coluna 2, o elemento na linha 1, coluna 3, o
elemento na linha 3, coluna 2, e o elemento na linha 3, coluna 3.
Esquemas mais complexos podem ser implementados usando endereçamento de matriz. UMA
abordagem de endereçamento particularmente útil usando matrizes para indexação é da
forma A (D) , onde D é uma matriz lógica. Por exemplo, se
então
>> A (D)
ans =
1
6
Finalmente, apontamos que o uso de um único dois pontos como um índice em uma matriz se-
leciona todos os elementos da matriz (coluna por coluna) e organiza
-los na forma de um vetor coluna. Por exemplo, com referência à matriz T2,
Este uso dos dois pontos é útil quando, por exemplo, queremos encontrar a soma de
todos os elementos de uma matriz:
Em geral, sum (v) adiciona os valores de todos os elementos do vetor de entrada v. Se
uma matriz é inserida em soma [como em soma (A)], a saída é um vetor linha contendo
as somas de cada coluna individual do array de entrada (este comportamento é típico
de muitas funções do MATLAB encontradas em capítulos posteriores). Usando um sin-
gle dois pontos da maneira que acabamos de ilustrar, estamos na realidade implementando o
comando
porque o uso de um único dois pontos converte a matriz em um vetor.
Usar a notação de dois pontos é na verdade uma forma de indexação linear em uma matr
ou matriz de dimensão superior. Na verdade, o MATLAB armazena cada array como uma colun
de valores, independentemente das dimensões reais. Esta coluna consiste na matriz
colunas, anexadas de ponta a ponta. Por exemplo, a matriz A é armazenada no MATLAB como
Acessando A com um único índice subscrito diretamente nesta coluna. Para a prova-
ple, A (3) acessa o terceiro valor da coluna, o número 7; A (8) acessos
o oitavo valor, 6 e assim por diante. Quando usamos a notação de coluna, estamos simplesmente
Página 1336 Capítulo 2 @ Fundamentos 2.9 i $ it Algumas matrizes padr
abordando todos os elementos, A (1 : fim). Este tipo de indexação é um grampo básico em
vetorizando loops para otimização do programa, conforme discutido na Seção 2.10.4.
EXEMPLO 2.5: % A imagem na Fig. 2.6 (a) é uma imagem de intensidade de 1024 X 1024, f, da classe uint8.
Alguns simples A imagem na Fig. 2.6 (b) foi invertida verticalmente usando a declaração
operações de imagem
usando array >> fp = f (fim: -l: l, :);
indexação.
A imagem mostrada na Fig. 2.6 (c) é uma seção da imagem (a), obtida usando
o comando
FIGURA 2.6
Resultados obtidos
usando array
indexação.
(a) Original
imagem. (b) Imagem
invertido verticalmente.
(c) Cortado
imagem.
(d) Subamostrado
imagem. (e) A
varredura horizontal
linha através do
meio do
Imagem em (a).
Da mesma forma, a Fig. 2.6 (d) mostra uma imagem subamostrada obtida usando o
demonstração
Finalmente, a Fig. 2.6 (e) mostra uma linha de varredura horizontal no meio de
Fig. 2.6 (a), obtida usando o comando
A função de plot é discutida em detalhes na Seção 3.3.1. nrai
2.8.3 Selecionando Dimensões de Matriz
Operações do formulário
operação (A, dim)
onde operação denota uma operação aplicável do MATLAB , A é uma matriz,
e dim é um escalar, são usados com freqüência neste livro. Por exemplo, suponha que
A é uma matriz de tamanho M X N. O comando
dá o tamanho de A ao longo de sua primeira dimensão, que é definida pelo MATLAB como
a dimensão vertical. Ou seja, este comando fornece o número de linhas em A.
Da mesma forma, a segunda dimensão de uma matriz está na direção horizontal, então
o tamanho da instrução (A, 2) dá o número de colunas em A. Um singleton di-
mension é qualquer dimensão, dim, para a qual o tamanho (A, dim) = 1. Usando estes
cepts, poderíamos ter escrito o último comando no Exemplo 2.5 como
O MATLAB não restringe o número de dimensões de uma matriz, sendo
capaz de extrair os componentes de uma matriz em qualquer dimensão é um importante
característica. Na maior parte, lidamos com matrizes 2-D, mas existem várias
posturas (como ao trabalhar com imagens coloridas ou multiespectrais) quando necessário
sário ser capaz de "empilhar" imagens ao longo de uma terceira dimensão ou superior. Nós negoc
com isso nos capítulos 6,11 e 12. Função ndims, com sintaxe
fornece o número de dimensões da matriz A. A função ndims nunca retorna um
valor menor que 2 porque mesmo os escalares são considerados bidimensionais, no
perceber que são matrizes de tamanho 1 X 1.
Algumas matrizes padrão importantes
Muitas vezes, é útil ser capaz de gerar matrizes de imagens simples para experimentar ideias
e para testar a sintaxe das funções durante o desenvolvimento. Nesta seção, nós in-
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 9/17
apresentar sete funções geradoras de matrizes que serão usadas em capítulos posteriores. Se
apenas um argumento é incluído em qualquer uma das seguintes funções, o resultado é um
Página 14
2.1 0 Introdução à Programação da Fun
38 Capítulo 2 a Fundamentos
zeros (M, N) gera uma matriz M x N de 0s de classe dupla.
uns (M, N) gera uma matriz M x N de 1s de classe dupla.
verdadeiro (M, N) gera uma matriz lógica M x N de 1s.
f alse (M, N) gera uma matriz lógica M x N de 0s.
mágica (M) gera um M x M "quadrado mágico". Esta é uma matriz quadrada em
em que a soma ao longo de qualquer linha, coluna ou diagonal principal é a mesma. Magia
quadrados são matrizes úteis para fins de teste porque são fáceis de
gerar e seus números são inteiros.
rand (M, N) gera uma matriz M x N cujas entradas são distribuídas uniformemente
números aleatórios usados no intervalo [O, 11.
randn (M, N) gera uma matriz M x N cujos números são normalmente dis-
números aleatórios tributados (ou seja, gaussianos) com média 0 e variância 1.
Por exemplo,
ans =
8 1 6
3 5 7
4 9 2
Introdução à Programação de Função M
Um dos recursos mais poderosos da Caixa de Ferramentas de Processamento de Imagens é o seu
acesso transparente ao ambiente de programação MATLAB. Como será-
tornar-se evidente em breve, a programação da função MATLAB é flexível e particular
extremamente fácil de aprender.
?! + I 0.1 M-Files
Os chamados arquivos M no MATLAB podem ser scripts que simplesmente executam uma série de
Declarações MATLAB, ou podem ser funções que podem aceitar argumentos e
pode produzir uma ou mais saídas. O foco desta seção é na função de arquivo M
Essas funções estendem os recursos do MATLAB e do IPT para adicionar
aplicativos específicos de vestido, definidos pelo usuário.
Os arquivos M são criados usando um editor de texto e são armazenados com um nome de
form f ilename. m, como a média. me filtro . m. Os componentes de um
função M-arquivo são
A linha de definição de função
A linha HI
Texto de ajuda
O corpo da função
Comentários
A linha de definição da função tem a forma
função [saídas] = nome (entradas)
Por exemplo, uma função para calcular a soma e o produto (duas saídas diferentes
~ uts) de duas imagens teriam a forma
função [s, p] = sumprod (f, g)
onde fe g são as imagens de entrada, s é a imagem da soma e p é o produto
imagem. O nome sumprod é definido arbitrariamente, mas a palavra função sempre
aparece à esquerda, na forma mostrada. Observe que os argumentos de saída são en-
fechada por colchetes e as entradas entre parênteses. Se o
função tem um único argumento de saída, é aceitável listar o argumento com-
fora dos colchetes. Se a função não tem saída, apenas a palavra função é usada,
sem colchetes ou sinal de igual. Os nomes das funções devem começar com uma letra e
os caracteres restantes podem ser qualquer combinação de letras, números e
derscores. Não são permitidos espaços. MATLAB distingue nomes de funções para cima
até 63 caracteres. Os caracteres adicionais são ignorados.
As funções podem ser chamadas no prompt de comando; por exemplo,
>> [s, p] = somaprod (f, g);
ou podem ser usados como elementos de outras funções, caso em que se tornam
subfunções. Conforme observado no parágrafo anterior, se a saída tiver um único ar-
gument, é aceitável escrevê-lo sem os colchetes, como em
A linha H1 é a primeira linha de texto. É uma única linha de comentário que segue o
linha de definição de função. Não pode haver linhas em branco ou espaços iniciais entre
a linha H1 e a linha de definição da função. Um exemplo de linha H1 é
% SUMPROD Calcula a soma e o produto de duas imagens
Conforme indicado na Seção 1.7.3, a linha H1 é o primeiro texto que aparece quando um
tipos de usuário
'> ajuda nome-da-função
Página 1540 Capítulo 2 a Fundamentos 2,1 0 Introdução à Programação de Fu
no prompt do MATLAB. Além disso, conforme mencionado nessa seção, digitar lookfor
palavra-chave exibe todas as linhas HI contendo a palavra-chave da string. Esta linha pro
fornece informações de resumo importantes sobre o arquivo M, por isso deve ser tão de-
o mais script possível.
O texto de ajuda é um bloco de texto que segue a linha HI, sem linhas em branco no
entre os dois. O texto de ajuda é usado para fornecer comentários e ajuda online para
a função. Quando um usuário digita help f untion-name no prompt, MAT-
LAB exibe todas as linhas de comentário que aparecem entre a definição da função
linha e a primeira linha sem comentários (executável ou em branco). O sistema de ajuda ig-
nores quaisquer linhas de comentário que apareçam após o bloco de texto de Ajuda.
O corpo da função contém todo o código MATLAB que realiza cálculos
ções e atribui valores aos argumentos de saída. Vários exemplos de MATLAB
o código é fornecido posteriormente neste capítulo.
Todas as linhas precedidas do símbolo "%" que não são a linha HI ou o texto de ajuda são
são consideradas linhas de comentário de função e não são consideradas parte do texto de Ajuda
quadra. É permitido acrescentar comentários ao final de uma linha de código.
Os arquivos M podem ser criados e editados usando qualquer editor de texto e salvos com o
extensão . m em um diretório especificado, normalmente no caminho de pesquisa do MATLAB.
Outra maneira de criar ou editar um arquivo M é usar a função de edição no
incitar. Por exemplo,
c4.d
-); 6> editar >> editar sumprod
, /
abre para editar o arquivo sumprod. m se o arquivo existe em um diretório que está no
de elementos correspondentes de A e B. Em outras palavras, se C = A. * B,
então C ( I, J ) = A ( I, J ) "6 ( I, J ) . Porque as operações de matriz e matriz são os
o mesmo para adição e subtração, os pares de caracteres . + e .- não são usados.
Ao escrever uma expressão como B = A, o MATLAB faz uma "nota" de que B
é igual a A, mas não copia realmente os dados para B , a menos que o conteúdo de
Uma mudança mais tarde no programa. Este é um ponto importante porque usando dif-
diferentes variáveis para "armazenar" as mesmas informações às vezes podem aprimorar o códig
clareza e legibilidade. Assim, o fato de que o MATLAB não duplica informações
a menos que seja absolutamente necessário, vale a pena lembrar ao escrever
Código MATLAB. A Tabela 2.4 lista os operadores aritméticos do MATLAB, onde A
MATLAB Comentários
Operador Nome Função e exemplos
+ Matriz e matriz mais (A, B)
Adição
- Matriz e matriz menos (A, 8)
subtração
. * Tempos de multiplicação da matriz (A, 13)
* Multiplicação de matrizes vezes (A, B) A * B, matriz padrão
multiplicação, ou um * A,
multiplicação de um escalar
vezes todos os elementos de A.
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 10/17
Caminho do MATLAB ou no diretório atual. Se o arquivo não puder ser encontrado, MAT-
O LAB dá ao usuário a opção de criá-lo. Conforme observado na Seção 1.7.2, o
A janela do editor MATLAB tem vários menus suspensos para tarefas como
salvar, visualizar e depurar arquivos. Porque ele realiza algumas verificações simples
e usa cores para diferenciar entre vários elementos de código, este texto edita
tor é recomendado como a ferramenta de escolha para escrever e editar funções-M.
2,1 0,2 Operadores
Os operadores do MATLAB são agrupados em três categorias principais:
Operadores aritméticos que realizam cálculos numéricos
Operadores relacionais que comparam operandos quantitativamente
Operadores lógicos que executam as funções AND, OR e NOT
Eles são discutidos no restante desta seção.
Operadores aritméticos
O MATLAB tem dois tipos diferentes de operações aritméticas. Aritmética matricial
as operações são definidas pelas regras da álgebra linear. Array aritmética opera-
ções são realizadas elemento a elemento e podem ser usadas com
dvt matrizes sazonais. O caractere ponto (ponto) (.) Distingue as operações de matriz
' notahon das operações da matriz. Por exemplo, A * B indica multiplicação de matriz no
sentido tradicional, enquanto A. * B indica multiplicação de matriz, no sentido de que
o resultado é uma matriz, do mesmo tamanho que A e 6, em que cada elemento é o
.EU Divisão direita da matriz rdivide (A, 8)
. \ Divisão esquerda da matrizldividir (A, B)
/ Matriz divisão direita mrdivide (A, B)
\ Divisão da esquerda da matriz
. Poder de matriz
UMA Poder da matriz
. ' Vetor e matriz
transpor
Vetor e matriz
conjugado complexo
transpor
+ Mais unário
- Unário menos
Cólon
C = A / B, C (1, J)
= A (I, J) / B (I, J).
C = A. \ B, C (1, J)
= B (I, J) / A (I, J).
A / B é praticamente o mesmo que
A * inv (B), dependendo
na precisão computacional.
mldivide (A, B) A \ B é praticamente o mesmo que
inv (A) * B, dependendo
na precisão computacional.
potência (A, B) Se C = A. ^ B, então
C (1, J) =
A (1, J) * B (I, J).
mpower (A, B) Consulte a ajuda on-line para um
discussão deste operador.
transpor (A) A. ' . Vetor padrão e
matriz transposta.
ctranspor (A) A '. Vetor padrão e
conjugado de matriz transposta.
WhenAisrealA. ' = A '.
uplus (A) + A é igual a 0 + A.
uminus (A) -A é igual a 0 -A
ou -1 * A.
Discutido na Seção 2.8.
Página 16
$ 2 Capítulo 2 a Fundamentos 2.1 0 is8 Introdução à Programação da F
LABLE 2.5
Eu sou a imagem
iritmético
'unções
; apoiado pelo IPT.
Função Descrição
Imadd Adiciona duas imagens; ou adiciona uma constante a uma imagem.
Eu estou subtraídoSubtrai duas imagens; ou subtrai uma constante de uma imagem.
multiplicar Multiplica duas imagens, onde a multiplicação é
realizado entre pares de elementos de imagem correspondentes;
ou multiplica uma constante por uma imagem.
imdivide Divide duas imagens, onde a divisão é realizada
entre pares de elementos de imagem correspondentes; ou divide
uma imagem por uma constante.
Eu imabsdiff Calcula a diferença absoluta entre duas imagens.
Eu implemento Complementa uma imagem. Consulte a Seção 3.2.1.
imlincomb Calcula uma combinação linear de duas ou mais imagens. Ver
Seção 5.3.1 para um exemplo.
e B são matrizes ou matrizes e um e b são escalares. Todos os operandos podem ser reais
ou complexo. O ponto mostrado nos operadores da matriz não é necessário se o
operandos são escalares. Lembre-se de que as imagens são matrizes 2-D, que são
equivalente a matrizes, então todos os operadores na tabela são aplicáveis a
imagens.
A caixa de ferramentas suporta as funções aritméticas de imagem listadasna Tabela 2.5. Al-
embora essas funções possam ser implementadas usando op-
diretamente, a vantagem de usar as funções do IPT é que elas oferecem suporte
as classes de dados inteiros, enquanto os operadores matemáticos equivalentes do MATLAB re-
quire entradas de classe double.
O exemplo 2.6, a seguir, usa as funções max e min. A primeira função tem
as formas de sintaxe
C = max (A)
C = max (A, 6)
C = max (A, [ 1, dim)
[C, i] = max (. . .)
Na primeira forma, se A for um vetor, max (A) retorna seu maior elemento; se A é um ma-
trix, então max (A) trata as colunas de A como vetores e retorna um vetor linha
contendo o elemento máximo de cada coluna. Na segunda forma,
max (A, B) retorna uma matriz do mesmo tamanho de A e B com os maiores elementos
retirado de A ou 6. Na terceira forma, max (A, [ ] , dim) retorna o maior elemento
mentos ao longo da dimensão de A especificada por dim escalar . Por exemplo, max (A,
[ 1 , 1) produz os valores máximos ao longo da primeira dimensão (as linhas) de
A. Finalmente, [C, I I = max ( . .. ) Também encontra os índices dos valores máximos de
A, e os retorna no vetor de saída I. Se houver vários idênticos máximos
valores, o índice do primeiro encontrado é retornado. Os pontos indicam a sintaxe
localizado à direita de qualquer uma das três formas anteriores. Função min tem o
mesmas formas de sintaxe que acabamos de descrever.
Suponha que queremos escrever uma função M, chame-a de fgprod, que multiplica o EXEM
duas imagens de entrada e saídas do produto das imagens, o máximo e o mínimo - Ilustração d
valores imum do produto e uma imagem normalizada do produto cujos valores são operadores
no intervalo [0, 11. Usando o editor de texto, escrevemos a função desejada da seguinte manei
função [p, pmax, pmin, pnl = improd (f, g)
% IMPROD Calcula o produto de duas imagens.
% [P, PMAX, PMIN, PN] = IMPROD (F, G) t gera o elemento por-
% produto do elemento de duas imagens de entrada, F e GI o produto
% dos valores máximo e mínimo, e uma matriz de produto normalizada com
Valores de % no intervalo [0, I]. As imagens de entrada devem ser iguais
% size. Eles podem ser da classe uint8, unit16 ou double. As saídas
% são de classe dupla.
fd = duplo (f);
gd = duplo (g);
p = fd. * gd;
pmax = max (p (:));
pmin = min (p (:));
pn = mat2gray (p);
Observe que as imagens de entrada foram convertidas para o dobro usando a função
double em vez de im2double porque, se as entradas fossem do tipo uint8,
im2double iria convertê-los para o intervalo [0, 11. Presumivelmente, queremos p a
contém o produto dos valores originais. Para obter uma matriz normalizada, pn, em
o intervalo [O, l] usamos a função mat2gray. Observe também o uso de dois pontos simples
indexação, conforme discutido na Seção 2.8.
Suponha que f = [I 2; 3 41 e g = [I 2; 2 1 1. Digitando o anterior
função no prompt resulta na seguinte saída:
>> [p, pmax, pmin, pn] = improd (f, g)
P =
1 4
pmax =
6
pmin =
'Na documentação do MATLAB , é comum usar caracteres maiúsculos na linha H1 e no texto da Ajuda
ao referir-se a nomes de funções e argumentos. Isso é feito para evitar confusão entre o programa
nomes / variáveis e texto explicativo normal.
Página 1746 Capítulo 2 r Fundamentos
EXEMPLO 2.8: a Considere a operação AND nas seguintes matrizes numéricas:
Operadores lógicos.
>> A = [I 2 0; 0 4 51;
2.1 0 r Introdução à Programação da Fun
ans =
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 11/17
>> B = [I -2 3; 0 1 11;
>> A e B
ans =
1 1 0
0 1 1
Vemos que o operador AND produz uma matriz lógica que é do mesmo tamanho
como as matrizes de entrada e tem um 1 nos locais onde ambos os operandos são diferentes de zero
e 0s em outro lugar. Observe que todas as operações são feitas em pares de correspondentes
elementos das matrizes, como antes.
O operador OR funciona de maneira semelhante. Uma expressão OR é verdadeira se ei-
o operando é uma quantidade numérica lógica 1 ou diferente de zero, ou se ambos são
1s lógicos ou números diferentes de zero; caso contrário, é falso. O operador NOT funciona
com uma única entrada. Logicamente, se o operando for verdadeiro, o operador NOT converte
para falso. Ao usar NOT com dados numéricos, qualquer operando diferente de zero torna-se
0, e qualquer operando zero torna-se 1. S
O MATLAB também suporta as funções lógicas resumidas na Tabela 2.8. O
todas e quaisquer funções são particularmente úteis na programação.
EXEMPLO 2.9: Considere as matrizes simples A = [ 1 2 3; 4 5 61 e B = [0 -1 1 ; 0 0 21.
Funções lógicas. Substituir essas matrizes nas funções na Tabela 2.8 produz os seguintes resultados:
ans =
TABELA 2.8
Funções lógicas.
Função Comentários
xor ( OU exclusivo ) A função xor retorna 1 apenas se ambos os operandos forem
logicamente diferente; caso contrário, xor retorna 0.
tudo A função all retorna 1 se todos os elementos em um
vetor são diferentes de zero; caso contrário, tudo retorna um 0. Isso
função opera coluna a nível em matrizes.
algum A qualquer função retorna um 1 , se qualquer um dos elementos numa
o vetor é diferente de zero; caso contrário, qualquer retorna um 0. Isso
função opera coluna a nível em matrizes.
1 1 1
ans =
1 1 1
>> todos (B)
ans =
0 0 1
>> qualquer (B)
ans =
0 1 1
Observe como todas as funções operam nas colunas A e B. Por exemplo,
os primeiros dois elementos do vetor produzido por todos (6) são 0 porque cada
das duas primeiras colunas de B contém pelo menos um 0; o último elemento é 1 be-
porque todos os elementos na última coluna de B são diferentes de zero. um
Além das funções listadas na Tabela 2.8, o MATLAB fornece um
número de outras funções que testam a existência de condições específicas
ou valores e retornam resultados lógicos. Algumas dessas funções estão listadas em
Tabela 2.9. Alguns deles lidam com termos e conceitos discutidos anteriormente em
este capítulo (por exemplo, consulte a função islogical na Seção 2.6.2); outras
são usados em discussões subsequentes. Lembre-se de que as funções listadas em
A Tabela 2.9 retorna um 1 lógico quando a condição sendo testada é verdadeira; outro-
sábio, eles retornam um 0 lógico. Quando o argumento é uma matriz, alguns dos
funções na Tabela 2.9 produzem uma matriz do mesmo tamanho que o argumento contém-
ing 1s lógicos nos locais que satisfazem o teste realizado pela função,
e 0s lógicos em outro lugar. Por exemplo, se A = [I 2; 3 01/01, a função
isf inite (A) retorna a matriz [ 1 1 ; 1 01, onde a entrada 0 (falsa) indica
indica que o último elemento de A não é finito.
Algumas variáveis e constantes importantes
As entradas na Tabela 2.10 são amplamente utilizadas na programação do MATLAB. Para
exemplo, eps normalmente é adicionado a denominadores em expressões para evitar
estouro no caso de um denominador se tornar zero.
Página 18
: 8 Capítulo 2 r Fundamentos
chapéu retornar a iscell (C) Verdadeiro se C for uma matriz de células.
.agical 1 ou a iscellstr (s) Verdadeiro se s for uma matriz de células de strings.
'ABLE 2.9 Função Descrição
condição ~ r em isequal (A, 6) Verdadeiro se A e B tiverem elementos e dimensões idênticos.
' argumentos do herdeiro isf campo (S, ' nome ' ) Verdadeiro se ' nome ' for um campo da estrutura S.
~ algumas funções eu
' 2gicalO
dependendo de
se o valor
ischar (s) Verdadeiro se s for uma string de caracteres.
isempty (A) Verdadeiro se A for a matriz vazia, [ 1.
-0 lista completa
é verdade ou
alse. Veja online
.ajuda para um
ABLE 2.1 0
Alguns importantes
! ariáeis e
onstants.
iSf inite (A) Verdadeiro nas localizações da matriz A que são finitas.
isinf (A) Verdadeiro nas localizações da matriz A que são infinitas.
isletter (A) Verdadeiro nas localizações de A que são letras do alfabeto.
islógico (A) Verdadeiro se A for uma matriz lógica.
ismember (A, B) Verdadeiro em locais onde os elementos de A também estão em 6.
isnan (A) Verdadeiro nas localizações de A que são NaNs (ver Tabela 2.10 para
uma definição de NaN).
isnumeric (A) Verdadeiro se A for uma matriz numérica.
isprime (A) Verdadeiro emlocalizações de A que são números primos.
isreal (A) Verdadeiro se os elementos de A não tiverem partes imaginárias.
isspace (A) Verdadeiro em locais onde os elementos de A são espaços em branco
personagens.
issparse (A) Verdadeiro se A for uma matriz esparsa.
isstruct (S) Verdadeiro se S for uma estrutura.
Função Valor Retornado
ans Resposta mais recente (variável). Se nenhuma variável de saída for atribuída a
uma expressão, o MATLAB armazena automaticamente o resultado em ans.
~ PS Precisão relativa de ponto flutuante. Esta é a distância entre 1,0 e
o próximo maior número representável usando precisão dupla
ponto flutuante.
2.10 e Introdução à Programação da Função
Representação de Número
MATLAB usa notação decimal convencional, com um ponto decimal opcional
e os sinais iniciais de mais ou menos, para números. A notação científica usa a letra
e para especificar um fator de escala de potência de dez. Números imaginários usam i ou j como
um sufixo. Alguns exemplos de representações de números válidos são
Todos os números são armazenados internamente usando o formato longo especificado pelo Instituto
tuto do padrão de ponto flutuante para Engenheiros Elétricos e Eletrônicos (IEEE).
Os números de ponto flutuante têm uma precisão finita de aproximadamente 16 deci-
dígitos mal e um intervalo finito de aproximadamente para
2.1 0.3 Controle de Fluxo
A capacidade de controlar o fluxo de operações com base em um conjunto de configurações predefinida
ditions está no coração de todas as linguagens de programação. Na verdade, condicional
ramificação foi um dos dois principais desenvolvimentos que levaram à formulação de
computadores de uso geral na década de 1940 (o outro desenvolvimento foi o uso
de memória para armazenar programas e dados armazenados). MATLAB fornece os oito
declarações de controle de fluxo resumidas na Tabela 2.11. Tenha em mente o observa-
ção feita na seção anterior que o MATLAB trata um lógico 1 ou diferente de zero
número como verdadeiro e um 0 lógico ou numérico como falso.
Demonstração
se, junto com else e elself, executa um grupo de
declarações baseadas em uma condição lógica especificada.
Executa um grupo de instruções em um número fixo (especificado) de
vezes.
enquanto Executa um grupo de instruções um número indefinido de vezes,
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 12/17
i (ou j) Unidade imaginária, como em 1 + 2i.
NaN ou nan significa não um número (por exemplo, 010).
realmax O maior número de ponto flutuante que seu computador pode representar.
realmin O menor número de ponto flutuante que seu computador pode
representar.
computador Seu tipo de computador.
versão Cadeia de versão do MATLAB.
com base em uma condição lógica especificada.
pausa Termina a execução do loop afor ou while.
Prosseguir Passa o controle para a próxima iteração de um loop for ou while,
pulando quaisquer instruções restantes no corpo do loop.
interruptor switch, junto com case e caso contrário, executa diferentes
grupos de declarações, dependendo de um valor especificado ou
fragmento.
Retorna Faz com que a execução retorne à função de chamada.
tentar. . .pega Altera o controle de fluxo se um erro for detectado durante a execução.-
Página 1950 Capítulo 2 & # Fundamentos
if, else e elseif
Declaração condicional se tiver a sintaxe
se expressão
afirmações
fim
A expressão é avaliada e, se a avaliação resultar verdadeira, MATLAB ex-
ecutes um ou mais comandos, denotados aqui como declarações, entre o if
e linhas finais . Se a expressão for falsa, o MATLAB pula todas as instruções antes de
entre as linhas if e end e retoma a execução na linha seguinte ao final
linha. Ao aninhar se s, cada caso deve ser emparelhado com uma correspondência final.
As instruções else e elseif condicionam ainda mais a instrução if .
A sintaxe geral é
se expressão
declarações 1
elseif expression2
declarações 2
senão
declarações 3
fim
Se expressionl for true, as instruções1 são executadas e o controle é transferido
para a instrução final . Se expressionl for avaliada como falsa, então expression2
é avaliado. Se esta expressão for avaliada como verdadeira, então as declarações 2 são executadas
cortado e o controle é transferido para a instrução final . Caso contrário (mais)
instruções3 são executadas. Observe que a instrução else não tem condição.
Os else e elseif declarações podem aparecer por si só após um se State-
ment; eles não precisam aparecer em pares, como mostrado na seção geral anterior
sintaxe. É aceitável ter várias instruções elseif .
EXEMPLO 2.10: Suponha que queremos escrever uma função que calcula a intenção média
Condicional sidade de uma imagem. Como discutido anteriormente, um array bidimensional f pode ser
ramificação e verted para um vector de coluna, v, deixando v = f ( : ). Portanto, nós queremos nosso
introdução de
erro de funções , função para poder trabalhar com entradas de vetor e imagem. O programa
comprimento, e deve produzir um erro se a entrada não for uma matriz unidimensional ou bidimensional.
numel.
função av = média (A)
"AVERAGE Calcula o valor médio de uma matriz.
% AV = AVERAGE (A) calcula o valor médio da entrada
% array, A, que deve ser um array I - D ou 2-D.
% Verifique a validade da entrada. (Tenha em mente que
% uma matriz de ID é um caso especial de uma matriz 2-D.)
se ndims (A)> 2
erro ('As dimensões da entrada não podem exceder 2.')
fim
% Calcular a média
av = soma (A (:)) / comprimento (A (:));
2,10 i% Introdução à Programação da Fun
Observe que a entrada é convertida em uma matriz 1-D usando A ( :). Em geral,
comprimento (A) retorna o tamanho da dimensão mais longa de uma matriz, A. Neste ex-
amplo, porque A ( : ) é um vector, o comprimento (A) dá o número de elementos de A.
Isso elimina a necessidade de testar se a entrada é um vetor ou uma matriz 2-D.
Outra maneira de obter o número de elementos em uma matriz diretamente é usar
função numel, cuja sintaxe é
Assim, se A é uma imagem, numel (A) fornece seu número de pixels. Usando esta função,
a última linha executável do programa anterior torna-se
Finalmente, observe que a função de erro termina a execução do programa e
mostra a mensagem contida entre parênteses (as aspas mostradas são
obrigatório).
s indicados na Tabela 2.11, um loop for executa um grupo de instruções de um determinado
led número de vezes. A sintaxe é
para índice = início: incremento: fim
afirmações
fim
É possível aninhar dois ou mais loops for , da seguinte maneira:
para índice1 = início1: incremento: fim
declarações 1
para índice2 = início2: incrementoZ: fim
declarações 2
fim
instruções loop1 adicionais
fim
Por exemplo, o seguinte loop é executado 11 vezes:
contagem = 0;
para k = 0: 0,1: 1
contagem = contagem + 1;
fim
Página 20
52 Capítulo 2 ! 8 # Fundamentos 2,1 0 ii! Introdução à Programação da F
Se o incremento do loop for omitido, será considerado 1. Os incrementos do loop também podem
ser negativo, como em k = 0 : -1: -lo. Observe que nenhum ponto-e-vírgula é necessário no final
de uma linha for . O MATLAB suprime automaticamente a impressão dos valores de um loop
índice. Conforme discutido em detalhes na Seção 2.10.4, ganhos consideráveis no programa
velocidade de execução pode ser alcançado através da substituição de laços com o chamado
código vetorizado sempre que possível.
EXEMPLO 2.11: #d Exemplo 2.2 comparou várias imagens usando diferentes valores de qualidade JPEG
Usando um loop for ues. Aqui, mostramos como gravar esses arquivos no disco usando um loop for . Suponha
escrever que temos uma imagem, f, e queremos gravá-la em uma série de arquivos JPEG com
imagens para arquivar.
fatores de qualidade variando de 0 a 100 em incrementos de 5. Além disso, suponha que
queremos escrever os arquivos JPEG com nomes de arquivo da forma série-xxx. j pg,
onde xxx é o fator de qualidade. Podemos fazer isso usando o seguinte
Por exemplo, os seguintes loops while aninhados terminam quando um e
b foram reduzidos a 0:
a = 10;
b = 5;
enquanto um
a = a - 1;
enquantob
b = b - 1;
fim
fim
Observe que, para controlar os loops, usamos a convenção do MATLAB de tratar um
valor numérico em um contexto lógico como verdadeiro quando é diferente de zero e como falso
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 13/17
para loop:
para q = 0: 5: 100
nome do arquivo = sprintf ('série-% 3d.jpg1, q);
imwrite (f, nome do arquivo, 'qualidade', q);
fim
Função sprintf, cuja sintaxe, neste caso, é
consulte a página de ajuda para gravar dados formatados como uma string, s. Nesta forma de sintaxe, charactersl e
sprintf para outro charact ers2 são cadeias de caracteres e % nd denota um número decimal (especi-
'yntax forms application- citado por q) com n dígitos. Neste exemplo, charactersl é series-, o valor de
capaz de esta função.
n é 3, charact ers2 é . j pg, e q tem os valores especificados no circuito. ; "tr
enquanto
Um enquanto ciclo executa um grupo de instruções durante o tempo que a expressão
controlar o circuito é t rue.The sintaxe seja
expressão enquanto
afirmações
fim
Como no caso off ou, enquanto os loops podem ser aninhados:
enquanto expressão1
declarações 1
enquanto expressão2
declarações 2
fim
instruções loop1 adicionais
fim
quando for 0. Em outras palavras, enquanto a e enquanto b são avaliados como verdadeiros , desde q
e b são diferentes de zero.
Como no caso de loops for , ganhos consideráveis na velocidade de execução do programa
pode ser alcançado substituindo os loops while por código vetorizado (Seção
2.10.4) sempre que possível.
$ break
Como o próprio nome indica, pausa termina a execução de um para ou enquanto loop.
Quando uma instrução break é encontrada, a execução continua com a próxima
'
declaração fora do loop. Em loops aninhados, o break sai apenas do interior
a maioria do loop que o contém.
Prosseguir
A instrução continue passa o controle para a próxima iteração do for ou
while loop em que aparece, ignorando quaisquer instruções restantes no corpo
do loop. Em loops aninhados, continue passa o controle para a próxima iteração de
o laço que o envolve.
interruptor
Esta é a declaração de escolha para controlar o fluxo de uma função M baseada
em diferentes tipos de entradas. A sintaxe é
switch switch-expression
case case-expression
Afirmações)
case {case-expression1 , case-expression2 ,. . . }afirmações)
por outro lado
afirmações)
fim
Página 2154 Capítulo 2 a Fundamentos
A construção switch executa grupos de instruções com base no valor de um
variável ou expressão. As palavras-chave são maiúsculas e minúsculas e delineiam
grupos. Apenas o primeiro caso correspondente é executado. ' Deve sempre haver um
end para coincidir com a instrução switch. As chaves são usadas quando vários
expressões são incluídas na mesma instrução case. Como um exemplo simples,
suponha que temos uma função M que aceita uma imagem f e a converte para
uma classe especificada, chame-a de newclass. Apenas três classes de imagem são aceitáveis para
a conversão: uint8, uint 16 e double. O seguinte fragmento de código por-
forma a conversão desejada e gera um erro se a classe da entrada
imagem não é uma das classes aceitáveis:
mudar de nova classe
case 'uint8'
g = im2uint8 (f);
case 'uintl6'
g = im2uintl6 (f);
case 'double'
g = im2duplo (f);
por outro lado
erro ('Classe de imagem desconhecida ou imprópria')
fim
A construção switch é usada extensivamente ao longo do livro.
EXEMPLO 2.12: Neste exemplo, escrevemos uma função M (baseada em loops for) para extrair um
Extraindo um subimagem retangular de uma imagem. Embora, conforme mostrado na próxima seção,
subimagem uma poderíamos fazer a extração usando uma única instrução MATLAB, usamos o pré-
dada imagem. enviou o exemplo mais tarde para comparar a velocidade entre os loops e o código vetorizado.
As entradas para a função são uma imagem, o tamanho (número de linhas e
colunas) da subimagem que queremos extrair e as coordenadas do topo,
canto esquerdo da subimagem. Lembre-se de que a origem da imagem no MATLAB
está em (1, I), conforme discutido na Seção 2.1.1.
função s = subim (f, m, n, rx, cy)
% SUBIM Extrai uma subimagem, s, de uma determinada imagem, f.
% A subimagem tem o tamanho m por n, e as coordenadas
% do seu canto superior esquerdo são (rx, cy).
s = zeros (m, n);
rowhigh = rx + m - 1;
colhigh = cy + n - 1;
xcount = 0;
para r = rx: rowhigh
xcount = xcount + 1;
ycount = 0;
'Ao contrário da construção de troca de linguagem C. A troca do MATLAB não "falha". Ou seja, troca
executa apenas o primeiro caso de correspondência: os casos de correspondência subsequentes não são executados. Portanto, interrompa o estado-
mentos não são usados.
2.1 0 tgl Introdução à Programação de Fu
para c = cy: colhigh
ycount = ycount + 1;
~ (xcontagem, ycontagem) = f (r, c);
fim
fim
Na seção a seguir, fornecemos uma implementação significativamente mais eficiente
deste código. Como exercício, o leitor deve implementar os procedimentos anteriores
grama usando while em vez de f ou loops. B
2.1 0.4 Otimização de Código
Conforme discutido com alguns detalhes na Seção 1.3, o MATLAB é uma linguagem de program
medidor projetado especificamente para operações de array. Aproveitando esse fato
sempre que possível, pode resultar em aumentos significativos na velocidade computacional.
Nesta seção, discutimos duas abordagens importantes para o código MATLAB opti-
mização: vetorização de loops e pré - alocação de matrizes.
Vetorização de Loops
Vetorizar significa simplesmente converter for e while loops em vec- equivalentes
operações de tor ou matriz. Como ficará evidente em breve, a vetorização pode re-
resulta não apenas em ganhos significativos na velocidade computacional, mas também ajuda
melhorar a legibilidade do código. Embora a vetorização multidimensional possa ser diferente
É difícil formular, às vezes, as formas de vetorização usadas no processo de imagem.
geralmente são diretos.
Começamos com um exemplo simples. Suponha que queremos gerar um 1-D
função da forma
f (x) = A sin (x / 2 ~)
para x = 0,1,2 ,. . . , M - 1. Um loop for para implementar este cálculo é
para x = 1 : M % Os índices de matriz no MATLAB não podem ser 0.
f (x) = A * sin ((x - 1) / (2 * pi));
fim
No entanto, esse código pode ser consideravelmente mais eficiente por meio da vetorização;
ou seja, aproveitando a indexação MATLAB, da seguinte forma:
Como este exemplo simples ilustra, a indexação 1-D geralmente é um simples
processar. Quando as funções a serem avaliadas possuem duas variáveis, otimizado
a indexação é um pouco mais sutil. O MATLAB fornece uma maneira direta de implementar
Avaliações de função 2-D via função meshgrid, que tem a sintaxe
[C, R] = meshgrid (c, r)
20/05/2021 Um pixel> ""
https://translate.googleusercontent.com/translate_f 14/17
Página 22
56 Capítulo 2 Fundamentos
Esta função transforma o domínio especificado por fileira vectores de c e r em ar-
raios C e R que podem ser usados para a avaliação de funções de duas variáveis
e gráficos de superfície 3D (observe que as colunas são listadas primeiro na entrada e
saída de meshgrid).
As linhas da matriz de saída C são cópias do vetor c, e as colunas de
a matriz de saída R são cópias do vetor r. Por exemplo, suponha que nós
deseja formar uma função 2-D cujos elementos são a soma dos quadrados do
valores de variáveis de coordenadas x e y de x = 0, 1 , 2 e y = 0, 1. O vec-
tor r é formado a partir dos componentes da linha das coordenadas: r = [0 1 21. Sim-
da mesma forma, c é formado a partir do componente coluna das coordenadas: c = [O 1]
(tenha em mente que r e c são vetores linha aqui). Substituindo esses dois
vetores em meshgrid resultam nas seguintes matrizes:
>> [C, R] = meshgrid (c, r)
C =
A função na qual estamos interessados é implementada como
o que dá o seguinte resultado:
Observe que as dimensões de h são comprimento (r) x comprimento (c). Observe também, por ex-
amplo, que h (1 , 1) = R (1, 1) ^ 2 + C ( 1 , 1) ^ 2. Assim, o MATLAB automaticamente
cuidou da indexação h. Esta é uma fonte potencial de confusão

Continue navegando