Mestrado - 1A2S - Tratamento de imagens em MatLab

Page 1

Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

PROCESSAMENTO DE IMAGEM E VISÃO ARTIFICIAL

Tratamento de imagens em MatLab

2011 João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

ÍNDICE 1.

2.

3.

Introdução............................................................................................................................. 3 1.1. Representação de Imagens Digitais .............................................................................. 3 1.2.

Passos Fundamentais do Processamento de Imagens.................................................. 4

1.3.

Técnicas de Pré-processamento ................................................................................... 6

1.4.

Resumo dos comandos de processamento digital de imagem..................................... 9

Desenvolvimento ................................................................................................................ 10 2.1. Software desenvolvido................................................................................................ 11 2.1.1.

Técnicas de Pré-processamento ......................................................................... 12

2.1.2.

Técnicas de Transformação................................................................................. 14

2.2.

Processamento da Imagem 1 ...................................................................................... 16

2.3.

Processamento da Imagem 2 ...................................................................................... 17

2.4.

Processamento da Imagem 3 ...................................................................................... 18

2.5.

Processamento da Imagem 4 ...................................................................................... 19

2.6.

Transformações à Imagem 1 ....................................................................................... 20

2.7.

Transformações à Imagem 2 ....................................................................................... 21

2.8.

Transformações à Imagem 3 ....................................................................................... 22

2.9.

Transformações à Imagem 4 ....................................................................................... 23

Programa em matlab........................................................................................................... 24 3.1. Ficheiro “inicial.m” ...................................................................................................... 24 3.2.

Ficheiro “Processamento.m” ...................................................................................... 25

3.3.

Ficheiro “Transformacao.m” ....................................................................................... 37

3.4.

Ficheiro “transformação1.m”...................................................................................... 46

3.5.

Ficheiro “butterworthhigh.m” .................................................................................... 56

3.6.

Ficheiro “butterworthlow.m”...................................................................................... 56

3.7.

Ficheiro “butterworthreject.m” .................................................................................. 57

3.8.

Ficheiro “Contraste.m”................................................................................................ 57

3.9.

Ficheiro “Fourier.m”.................................................................................................... 57

3.10. Ficheiro “FourierShift.m” ............................................................................................ 57 3.11. Ficheiro “Histograma.m”............................................................................................. 57 3.12. Ficheiro “PassaBanda.m” ............................................................................................ 57 3.13. Ficheiro “threshold.m”................................................................................................ 58 4. 5.

Conclusões........................................................................................................................... 59 Bibliografia .......................................................................................................................... 60

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

1


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

ÍNDICE DE FIGURAS Figura 1 - Convenção dos eixos para representação de imagens digitais..................................... 4 Figura 2 - Passos fundamentais em processamento de imagens digitais ..................................... 6 Figura 3 - Exemplo de histograma................................................................................................. 7 Figura 4 - Imagens originais......................................................................................................... 10 Figura 5 - Menu inicial do trabalho ............................................................................................. 11 Figura 6 - Interface das Técnicas de Pré-processamento............................................................ 12 Figura 7 – Resultado da aplicação do filtro de “Contraste” seguido de “Histograma”............... 13 Figura 8 - Resultado da aplicação do filtro “Histograma” seguido “Remover Ruído” ................ 13 Figura 9 - Parte do menu do nosso interface.............................................................................. 14 Figura 10 – Resultado das transformações feitas à imagem 1.................................................... 14 Figura 11 – Resultado das transformações feitas à imagem 2.................................................... 15 Figura 12 - Imagem original (003.jpg) ......................................................................................... 16 Figura 13 - 1º Pré-processamento da imagem 003.jpg............................................................... 16 Figura 14 - 2º Pré-processamento da imagem 003.jpg............................................................... 16 Figura 15 - Imagem original (004.jpg) ......................................................................................... 17 Figura 16 – 1º Pré-processamento da imagem 004.jpg .............................................................. 17 Figura 17 – 2º Pré-processamento da imagem 004.jpg .............................................................. 17 Figura 18 – Imagem original (005.jpg) ........................................................................................ 18 Figura 19 - 1º Pré-processamento da imagem 005.jpg............................................................... 18 Figura 20 - 2º Pré-processamento da imagem 005.jpg............................................................... 18 Figura 21 – Imagem original (006.jpg) ........................................................................................ 19 Figura 22 - 1º Pré-processamento da imagem 006.jpg............................................................... 19 Figura 23 - 2º Pré-processamento da imagem 006.jpg............................................................... 19 Figura 24 - Imagem original n.º 1 (003.jpg)................................................................................. 20 Figura 25 - Rotação 160 graus da imagem 003.jpg ..................................................................... 20 Figura 26 - Cisalhamento da imagem 003.jpg............................................................................. 20 Figura 27 - Transformação 2 da imagem 003.jpg........................................................................ 20 Figura 28 - Imagem original (004.jpg) ......................................................................................... 21 Figura 29 – Edge da imagem 004.jpg .......................................................................................... 21 Figura 30 - Rotação -5 graus da imagem 004.jpg........................................................................ 21 Figura 31 - Redimensionar da imagem 004.jpg........................................................................... 21 Figura 32 – Imagem original (005.jpg) ........................................................................................ 22 Figura 33 - Edge da imagem 005.jpg ........................................................................................... 22 Figura 34 - Transformação da imagem 005.jpg........................................................................... 22 Figura 35 - Transformação 2 da imagem 005.jpg........................................................................ 22 Figura 36 – Imagem original (006.jpg) ........................................................................................ 23 Figura 37 - Rotação 5 graus da imagem 006.jpg ......................................................................... 23 Figura 38 - Cisalhamento da imagem 006.jpg............................................................................. 23

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

2


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

1. INTRODUÇÃO O Processamento de Imagem é qualquer forma de processamento de dados no qual a entrada e saída são imagens tais como fotografias, imagens digitalizadas ou vídeos. Ao contrário do tratamento de imagens, que se preocupa somente com a manipulação de figuras para sua representação final, o processamento de imagens é um estágio para novos processamentos de dados tais como aprendizagem da máquina ou reconhecimento de padrões como a alimentação de uma base de dados relacional. Neste trabalho, o processamento de imagem foi utilizado para se ajustar parâmetros da formatação da imagem, como o brilho, o contraste, a rotação e limpeza permitindo uma melhor qualidade no reconhecimento, indexação e visualização da imagem. De modo geral, um processamento realiza-se de acordo com a sequência seguinte:  

A Entrada (Input) – Refere-se a algum dado de entrada do processamento, são valores onde o processo irá actuar. O Processamento - É onde os dados de entrada serão processados para gerar um determinado resultado. O computador executa o arquivo.

 A Saída (Output) - É o resultado de todo o processamento, que pode ser visualizado no ecrã, em papel, armazenadas, ou até mesmo servir como entrada para um outro processo.

1.1.

REPRESENTAÇÃO DE IMAGENS DIGITAIS

O termo imagem monocromática, ou simplesmente imagem, refere-se à função bidimensional de intensidade da luz f(x,y), onde x e y denotam as coordenadas espaciais e o valor f em qualquer ponto (x, y) é proporcional ao brilho (ou níveis de cinzento) da imagem naquele ponto. Às vezes torna-se útil a visualização da função da imagem em perspectiva com um terceiro eixo representando o brilho. Neste caso, a Figura 1 apareceria como uma série de picos em regiões com numerosas modificações do nível de brilho e regiões planas em que os níveis de brilho variam pouco ou são constantes. Usando-se esta convenção para atribuir proporcionalmente valores mais altos para áreas de maior brilho obtém-se a altura dos componentes da figura proporcional ao brilho correspondente na imagem. Uma imagem digital é uma imagem f(x, y) discretizada tanto em coordenadas espaciais quanto em brilho. Uma imagem digital pode ser considerada como sendo uma matriz cujos índices de linhas e de colunas identificam um ponto na imagem, e o correspondente valor do elemento da matriz identifica o nível de cinzento naquele ponto. Os elementos dessa matriz digital são João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

3


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial chamados de elementos da imagem, elementos da figura, "pixeis" ou "pels", estes dois últimos, abreviações de "picture elements" (elementos de figura). Quanto mais pixeis por unidade de área, uma imagem tiver melhor é a sua resolução e qualidade.

Figura 1 - Convenção dos eixos para representação de imagens digitais

A Convenção dos eixos para representação de imagens digitais no Processamento de Imagens é diferente da convenção usada na Computação Gráfica.

1.2.

PASSOS FUNDAMENTAIS DO PROCESSAMENTO DE IMAGENS

Um exemplo de aplicação, que é bastante fácil de ser definida sem qualquer conhecimento prévio de conceitos de imagem, é o uso de técnicas de processamento de imagens para leitura automática de endereços em correspondências. A Figura 2 mostra que o objectivo global é produzir um resultado a partir do domínio do problema utilizando de processamento de imagens. Neste exemplo, o domínio do problema consiste em correspondências e o objectivo é ler o endereço em cada uma delas. Assim, a saída desejada nesse caso é uma sequência de caracteres alfanuméricos. O primeiro passo no processo é a aquisição da imagem, isto é, adquirir uma imagem digital. Para isso, necessitamos de um sensor para imagem e a capacidade de digitalizar o sinal produzido pelo sensor (por exemplo uma câmara fotográfica digital), sendo o resultado disto uma imagem bidimensional. Se a saída da câmara não se encontrar na forma digital, um conversor analógico-digital realiza a digitalização. A natureza do sensor e da imagem que ele produz são determinadas pela aplicação. Após a obtenção de uma imagem digital, o passo seguinte trata de pré-processar aquela imagem. A função chave no pré-processamento é melhorar a imagem de forma a aumentar as possibilidades de sucesso dos processos seguintes. Neste exemplo, o pré-processamento

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

4


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial tipicamente envolve técnicas para o realce de contrastes, remoção de ruído e isolamento de regiões cuja textura indique a probabilidade de informação alfanumérica. A próxima fase trata da segmentação que divide uma imagem de entrada em partes ou objectos constituintes. Em geral, a segmentação automática é uma das tarefas mais difíceis no processamento de imagens digitais. Por um lado, um procedimento de segmentação robusto favorece substancialmente a solução bem-sucedida de um problema de imagem. Por outro lado, algoritmos de segmentação fracos ou erráticos quase sempre levam a uma falha no processamento. No caso de reconhecimento de caracteres, o papel básico da segmentação é extrair caracteres individuais e palavras do fundo da imagem. A saída da fase de segmentação é constituída tipicamente por dados em forma de pixeis, correspondendo tanto à fronteira de uma região como a todos os pontos dentro da mesma. Em ambos os casos é necessário converter os dados para uma forma adequada ao processamento computacional. A primeira decisão que precisa ser feita é, se os dados devem ser representados como fronteiras ou como regiões completas. A representação por fronteira é adequada quando o interesse se concentra nas características da forma externa, tais como cantos ou pontos de inflexão. A representação por região é adequada quando o interesse se concentra em propriedades internas, tais como textura ou a forma do esqueleto. Noentanto, em algumas aplicações, essas representações coexistem. Essa situação acontece em aplicações de reconhecimento de caracteres, que frequentemente requerem algoritmos baseados na forma do contorno. A escolha de uma representação é apenas parte da solução para transformar os dados iniciais numa forma adequada para o subsequente processamento computacional. Um método para descrever os dados também deve ser especificado, de forma que as características de interesse sejam enfatizadas. O processo de descrição, também chamado selecção de características, procura extrair características que resultem em alguma informação quantitativa de interesse ou que sejam básicas para discriminação entre classes de objectos. Tratando-se de reconhecimento de caracteres, descritores tais como buracos e concavidades são características poderosas, que auxiliam na diferenciação entre uma parte do alfabeto e outra. A última etapa envolve reconhecimento e interpretação. Reconhecimento é o processo que atribui um rótulo a um objecto, baseado na informação fornecida pelo seu descritor. A interpretação envolve a atribuição de significado a um conjunto de objectos reconhecidos. Por exemplo, a identificação de um caracter, digamos a letra “c”, requer a associação dos descritores para aquele caracter com o rótulo c. A interpretação procura atribuir significado a um conjunto de entidades rotuladas. Por exemplo, uma cadeia de quatro números ou de

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

5


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial quatro números seguidos por um hífen mais três números, pode ser interpretada como um código postal.

Figura 2 - Passos fundamentais em processamento de imagens digitais

1.3.

TÉCNICAS DE PRÉ-PROCESSAMENTO

HISTOGRAMA O histograma de uma imagem fornece informação útil para fazer o realce e a análise da imagem. Revela ainda a distribuição dos níveis de cinzento da imagem. É representado por um gráfico que dá o número (frequência) de pixeis na imagem para cada nível de cinzento. Vamos considerar uma imagem digital g de M linhas e N colunas. O histograma da imagem g, Hg, pode, analiticamente, ser definido por: ‫ܪ‬௚ (݇) =

݊݇ ‫ ܯ‬.ܰ

onde nk é o número de vezes que o nível de cinzento K aparece na imagem

Pode-se utilizar o MATLAB para gerar o Histograma de uma imagem. Primeiro a imagem deve ser lida com o comando "imread" » g=imread('imagemdeteste.jpg')

Este comando tem como resultado a leitura desta imagem e posterior criação da matriz que a representa matematicamente. De seguida, gera-se o histograma da imagem: » tabhistimagem(g)

O resultado é mostrado na figura 3.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

6


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

Figura 3 - Exemplo de histograma

REALCE O objectivo 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. As técnicas de realce podem ser baseadas em:  

Processamento ponto-a-ponto que modifica o nível de cinzento de um pixel independentemente da natureza de seus vizinhos; Processo de filtragem, onde o novo valor depende também dos valores dos pontos vizinhos do ponto a ser processado.

CONTRASTE A manipulação do contraste de uma imagem tem como objectivo melhorar a sua qualidade visual sob critérios subjectivos 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. Tipicamente, os sensores são capazes de discretizar os valores recebidos num intervalo máximo que vai de 0 até 255 (8 bits = 256 possíveis valores). Devido à má iluminação, defeitos do sensor ou mesmo às características do que se está a fotografar, o intervalo de valores de intensidade ocupados pelos pixeis presentes numa imagem, pode ser muito menor que esse intervalo máximo. Diz-se então que a imagem possui baixo contraste, o que torna difícil a sua visualização ou interpretação por um intérprete humano ou um sistema de processamento digital. 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.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

7


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial Uma melhoria de contraste pode ser feita mapeando as variações dentro do intervalo de tons de cinzento [Vmin-Vmax] da imagem original para a variação máxima do dispositivo de visualização que, geralmente, é [0, 255]. Vmin e Vmax são os valores de níveis de cinzentos mínimos e máximos, respectivamente, presentes na imagem original. O mapeamento é realizado através de uma função, onde cada valor de nível de cinzento na imagem original é mapeado para um novo valor de acordo com uma função de transferência, que pode ser definida como: y=f(x) onde x é o nível de cinzento original e y é o novo valor correspondente.

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. Numa transformação linear, os valores de níveis de cinzento dos pixeis são escalonados de tal forma que todos os pixeis com valores Vmin e Vmax são mapeados para 0 e 255, respectivamente. Da mesma forma, os restantes valores intermédios de níveis de cinzento são mapeados para valores entre 0 e 255. Normalmente, a forma do histograma da imagem realçada é a mesma da imagem original, pois cada barra do histograma continua a ter a mesma altura, porém numa posição diferente. No entanto, algumas vezes a função de transferência causa uma sobreposição de valores, ou seja, dois ou mais valores x são mapeados para o mesmo valor y. 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 pixeis 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. Um procedimento de modificação de contraste útil é o mapeamento linear por partes com a função de mapeamento a ser caracterizada por um conjunto de pontos de quebra, que pode ser escolhido pelo utilizador. Funções de mapeamento não-lineares podem ser usadas para realçar detalhes específicos na imagem. Uma função linear também utilizada é a função negativa. Ela realiza o mapeamento inverso dos níveis de cinzento, revertendo a ordem do preto para o branco, de tal forma que pixéis com intensidade clara serão mapeados para escuro e vice-versa. A escolha do mapeamento directo adequado é, em geral, essencialmente empírica, mas existe uma classe de métodos nos quais o mapeamento tem por finalidade produzir uma imagem cujo histograma tenha um formato desejado. Um destes métodos é a equalização do histograma. João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

8


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial EQUALIZAÇÃO DO HISTOGRAMA Na equalização do 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 cinzento devem aparecer na imagem com a mesma frequência. Na prática, a obtenção de um histograma perfeitamente uniforme não é possível devido à natureza das imagens digitais, cujos pixéis podem assumir somente valores discretos. Existem técnicas para melhorar este problema, mas pode acontecer que áreas homogéneas na imagem original apareçam com “pintas”, uma vez que tons de cinzentos iguais são mapeados para níveis de cinzentos diferentes. O processo de equalização pode levar a falsos contornos na imagem, pois o número de níveis de cinzento pode ser reduzido. A equalização pode ter um efeito de realce notável da imagem, mas o contraste pode ser muito forte e, por isto a equalização de histograma deve ser usada com muito cuidado.

1.4.

RESUMO DOS COMANDOS DE PROCESSAMENTO DIGITAL DE

IMAGEM Leitura, escrita e visualização de Imagens

imread, imwrite, imshow, subimage, imfinfo fopen, fread, fwrite, fclose

Operações geométricas imcrop, imresize, imrotate, interp2 Melhoria de imagem imhist, imadjust, histeq, imnoise Trabalhar com cores

brighten, rgb2hsv, rgb2ycbcr, rgb2ntsc, rgb2gray, im2bw, dither

Ruído imnoise Filtros não lineares medfilt2, ordfilt2, wiener2 Filtros lineares de Kernel fspecial, filter2 Transformada de Fourier fft2, fftshift, abs Filtros na frequência freqz, freqz2, fsamp2, fwind1 Análise de Imagem Edge, imcontour, bwlabel bothat, erode, shrink, bridge, fill, skel, clean, Operações binárias sobre imagens hbreak, spur, close, majority, thicken, diag, open, thin, dilate, remove e tophat

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

9


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2. DESENVOLVIMENTO Seguindo as indicações do professor, escolhemos as 4 imagens seguintes com diferentes “problemas” de ruído e degradação.

Imagem original n.º 2 (003.jpg)

Imagem original n.º 2 (004.jpg)

Imagem original n.º 3 (005.jpg)

Imagem original n.º 4 (006.jpg)

Figura 4 - Imagens originais

Como podemos verificar, cada uma delas apresenta alguns problemas que iremos tentar corrigir utilizando duas técnicas de pré-processamento e 2 técnicas de transformação. Aproveitando também os conteúdos das aulas práticas, acrescentámos mais algumas técnicas de pré-processamento e de transformação.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

10


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.1.

SOFTWARE DESENVOLVIDO

Para tornar o processamento de imagem mais amigável, construímos um programa em Matlab, que usa o modo gráfico e cujo ecrã principal é o seguinte:

Figura 5 - Menu inicial do trabalho

Neste menu podemos ter acesso a: 

Técnicas de Pré-processamento – permite aplicar várias técnicas a uma imagem carregada no programa, tendo ainda a possibilidade de efectuar combinações de técnicas em duas janelas (1ºpré-processamento seguido de 2º pré-processamento) Técnicas de Transformação Imagem 1 – permite aplicar várias técnicas de transformação à imagem que está na janela do pré-processamento (1ºpréprocessamento) Técnicas de Transformação Imagem 2 – permite aplicar várias técnicas de transformação à imagem que está na janela do pré-processamento (2ºpréprocessamento)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

11


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.1.1.

TÉCNICAS DE PRÉ-PROCESSAMENTO

Seleccionando a opção Técnicas de Pré-processamento, iremos obter o interface da figura seguinte:

Figura 6 - Interface das Técnicas de Pré-processamento

Aqui pode-se abrir a imagem original e aplicar-lhe uma das oito técnicas de préprocessamento. De seguida é possível aplicar ao resultado desse 1ºpré-processamento, novamente as técnicas já referidas de modo a combinar filtros podendo obter assim melhores resultados. Claro que o resultado final depende dos “problemas” da imagem original, que poderão ser ou não corrigidos (melhoramento da imagem) com os filtros disponíveis no interface. De referir ainda que alguns filtros, devido à sua complexidade, poderão demorar alguns minutos a finalizar o processamento.

Como exemplo de utilização dos menus programados, aplicou-se duas sequências de filtros à nossa Imagem original n.º 1 (003.jpg).

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

12


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

Figura 7 – Resultado da aplicação do filtro de “Contraste” seguido de “Histograma”

Figura 8 - Resultado da aplicação do filtro “Histograma” seguido “Remover Ruído”

Como se pode ver na Figura 7, o resultado do 2ºpré-processamento é relativamente melhor que o correspondente na Figura 8. Contudo na Figura 8, o resultado final no 2ºpréprocessamento tem muito menos ruído que o da Figura 7. João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

13


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial Muitas mais sequências de simulação podem ser realizadas, mas devido ao elevado número de possibilidades, deixamos ao critério do utilizador essa experiência, pois para cada imagem a melhor sequência de filtros é diferente.

2.1.2.

TÉCNICAS DE TRANSFORMAÇÃO

Neste caso, existe a possibilidade de aplicar sete técnicas de transformação quer à imagem original, quer às tratadas nas outras duas janelas. Esse procedimento é facilitado pela possibildade de navegação entre os 2 menus de transformação de imagem. Não é necessário que o utilizador volte a abrir a imagem que pretende transformar, uma vez que esta é carregada automaticamente pelo programa, desde que este botão seja acedido através do menu.

Figura 9 - Parte do menu do nosso interface

Na figura seguinte mostramos o resultado de um exemplo da aplicação de duas técnicas de transformação aplicadas aos dois resultados dos pré-processamentos anteriores, nomeadamente rotação 10º e edge.

Figura 10 – Resultado das transformações feitas ao resultado da Figura 7

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

14


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

Figura 11 – Resultado das transformações feitas ao resultado da Figura 8

Nota-se claramente uma diferença no resultado final na Figura 10 relativamente ao da Figura 11.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

15


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.2.

PROCESSAMENTO DA IMAGEM 1

Depois de analisar esta imagem verifico-se que poderia ser melhorada alterando a escala para cinzentos, aumentando o brilho e o contraste e aplicando um filtro de nitidez. Nas figuras seguintes, estão os resultados dos préprocessamentos realizados.

Figura 12 - Imagem original (003.jpg)

Figura 13 - 1º Pré-processamento da imagem 003.jpg

Figura 14 - 2º Pré-processamento da imagem 003.jpg

Nesta imagem foi aplicada a “opção” Histograma

Nesta imagem foi aplicada a “opção” Contraste

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

16


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.3.

PROCESSAMENTO DA IMAGEM 2

Depois de analisar esta imagem verificou-se que poderia ser melhorada mudando a escala para cinzentos, aplicaando um filtro de nitidez e aumentaando o contraste. Nas figuras seguintes, estão os resultados dos pré-processamentos realizados.

Figura 15 - Imagem original (004.jpg)

Figura 16 – 1º Pré-processamento da imagem 004.jpg

Figura 17 – 2º Pré-processamento da imagem 004.jpg

Nesta imagem foi aplicada a “opção” Butterworth

Nesta imagem foi aplicada a “opção” Remover Ruído

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

17


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.4.

PROCESSAMENTO DA IMAGEM 3

Depois de analisar esta imagem verificou-se que poderia ser melhorada aumentando o brilho e aplicando um filtro de nitidez.

Figura 18 – Imagem original (005.jpg)

Figura 19 - 1º Pré-processamento da imagem 005.jpg

Figura 20 - 2º Pré-processamento da imagem 005.jpg

Nesta imagem foi aplicada a “opção” Butterworth

Nesta imagem foi aplicada a “opção” Histograma

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

18


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.5.

PROCESSAMENTO DA IMAGEM 4

Depois de analisar esta imagem verificou-se que poderia ser melhorada mudando a escala para cinzentos, aumentando o contraste e aplicando um filtro de nitidez.

Figura 21 – Imagem original (006.jpg)

Nesta imagem foi aplicada a “opção” Remover Ruído

Figura 22 - 1º Pré-processamento da imagem 006.jpg

Nesta imagem foi aplicada a “opção” Butterworth

Figura 23 - 2º Pré-processamento da imagem 006.jpg

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

19


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.6.

TRANSFORMAÇÕES À IMAGEM 1

Figura 24 - Imagem original n.º 1 (003.jpg)

Figura 25 - Rotação 160 graus da imagem 003.jpg

Figura 26 - Cisalhamento da imagem 003.jpg

Figura 27 - Transformação 2 da imagem 003.jpg

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

20


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.7.

TRANSFORMAÇÕES À IMAGEM 2

Figura 28 - Imagem original (004.jpg)

Figura 29 – Edge da imagem 004.jpg

Figura 30 - Rotação -5 graus da imagem 004.jpg

Figura 31 - Redimensionar da imagem 004.jpg

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

21


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.8.

TRANSFORMAÇÕES À IMAGEM 3

Figura 32 – Imagem original (005.jpg)

Figura 33 - Edge da imagem 005.jpg

Figura 34 - Transformação da imagem 005.jpg

Figura 35 - Transformação 2 da imagem 005.jpg

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

22


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

2.9.

TRANSFORMAÇÕES À IMAGEM 4

Figura 36 – Imagem original (006.jpg)

Figura 37 - Rotação 5 graus da imagem 006.jpg

Figura 38 - Cisalhamento da imagem 006.jpg

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

23


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

3. PROGRAMA EM MATLAB De seguida está todo o código programado e utilizado no neste trabalho.

3.1.

FICHEIRO “INICIAL.M”

function varargout = Inicial(varargin) % INICIAL MATLAB code for Inicial.fig % INICIAL, by itself, creates a new INICIAL or raises the existing % singleton*. % % H = INICIAL returns the handle to a new INICIAL or the handle to % the existing singleton*. % % INICIAL('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in INICIAL.M with the given input arguments. % % INICIAL('Property','Value',...) creates a new INICIAL or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Inicial_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Inicial_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Inicial % Last Modified by GUIDE v2.5 17-Jun-2011 15:15:14 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Inicial_OpeningFcn, ... 'gui_OutputFcn', @Inicial_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before Inicial is made visible. function Inicial_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Inicial (see VARARGIN) % Choose default command line output for Inicial clear workspace; clc; handles.output = hObject;

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

24


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % Update handles structure guidata(hObject, handles); % UIWAIT makes Inicial wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = Inicial_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in Botao1. function Botao1_Callback(hObject, eventdata, handles) % hObject handle to Botao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(Inicial, 'Visible', 'Off'); set(Processamento, 'Visible', 'On'); % --- Executes on button press in Botao2. function Botao2_Callback(hObject, eventdata, handles) % hObject handle to Botao2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(Inicial, 'Visible', 'Off'); set(Transformacao, 'Visible', 'On'); % --- Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(Inicial, 'Visible', 'Off'); set(Transformacao1, 'Visible', 'On'); % -------------------------------------------------------------------function File_Callback(hObject, eventdata, handles) % hObject handle to File (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% -------------------------------------------------------------------function sair_Callback(hObject, eventdata, handles) % hObject handle to sair (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) close;

3.2.

FICHEIRO “PROCESSAMENTO.M”

function varargout = Processamento(varargin) % PROCESSAMENTO M-file for Processamento.fig % PROCESSAMENTO, by itself, creates a new PROCESSAMENTO or raises the existing % singleton*. % % H = PROCESSAMENTO returns the handle to a new PROCESSAMENTO or the handle to % the existing singleton*. % % PROCESSAMENTO('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in PROCESSAMENTO.M with the given input arguments. % % PROCESSAMENTO('Property','Value',...) creates a new PROCESSAMENTO or raises the

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

25


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Processamento_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Processamento_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Processamento % Last Modified by GUIDE v2.5 17-Jun-2011 14:32:47 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Processamento_OpeningFcn, ... 'gui_OutputFcn', @Processamento_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before Processamento is made visible. function Processamento_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Processamento (see VARARGIN) %Limpar dados anteriores caso existam clc; clear workspace; % Inicializar a aplicação (limpar imagens) InitImageFig(handles); % Choose default command line output for Processamento handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes Processamento wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = Processamento_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

26


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

% Get default command line output from handles structure varargout{1} = handles.output; function sair1 (handles) filename1 = 'imagem1'; pathname1 = '@'; img1 = get(handles.filtro1,'Userdata'); file = [pathname1, filename1, '.jpg']; imwrite(img1, file, 'jpg');

function sair2 (handles) filename2 = 'imagem2' pathname2 = '@' img2 = get(handles.filtro2,'Userdata'); file = [pathname2, filename2, '.jpg']; imwrite(img2, file, 'jpg');

function InitImageFig(handles) set(handles.preprocessamento, 'Visible', 'Off'); img=ones(10,10,3); axes(handles.image_original); imagesc(img); axis off ; img1=ones(10,10,3); axes(handles.filtro1); imagesc(img1); axis off ; img2=ones(10,10,3); axes(handles.filtro2); imagesc(img2); axis off ; function ShowImageFile(filename,pathname,handles) if ~isequal(filename, 0) fn=strcat(pathname,filename); img_ori=imread(fn); axes(handles.image_original); imshow(img_ori); set(handles.image_original,'UserData',img_ori); end %*********************** MENUS DO SISTEMA FICHEIRO ************************ %************************************************************************** % -------------------------------------------------------------------function Ficheiro_Callback(hObject, eventdata, handles) % hObject handle to Ficheiro (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles

structure with handles and user data (see GUIDATA)

% -------------------------------------------------------------------function Abrir_Callback(hObject, eventdata, handles) % hObject handle to Abrir (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

27


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % Arir um ficheiro de imagem do disco do PC. [filename,pathname] = uigetfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff'},'Abrir Imagem:'); ShowImageFile(filename,pathname,handles); axis off ; % -------------------------------------------------------------------function Guardar1_Callback(hObject, eventdata, handles) % hObject handle to Guardar1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem','Info','help'); else [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','1º Pré-processamento'); if isequal(filename,0) | isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro1, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Guardar2_Callback(hObject, eventdata, handles) % hObject handle to Guardar2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro2)==0) msgbox('Sem Imagem Para Gravar','Info','help'); else [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','2º Pré-processamento'); if isequal(filename,0) | isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro2, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Sair_Callback(hObject, eventdata, handles) % hObject handle to Sair (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) closereq; set(Inicial, 'Visible', 'On'); %*************************** FIM MENUS SISTEMAS FICHEIROS ***************** %************************************************************************** %**************************** MENUS DAS TÉCNICAS ************************** %************************************************************************** % -------------------------------------------------------------------function tecnicas_Callback(hObject, eventdata, handles) % hObject handle to tecnicas (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

28


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % -------------------------------------------------------------------function preprocessamento_Callback(hObject, eventdata, handles) % hObject handle to preprocessamento (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(Transformacao1, 'Visible', 'Off'); set(Processamento, 'Visible', 'On');

% -------------------------------------------------------------------function transformacao_Callback(hObject, eventdata, handles) % hObject handle to transformacao (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro1)==0 || length(img_filtro2)==0) set(Processamento, 'Visible', 'Off'); set(Transformacao, 'Visible', 'On'); else sair1 (handles); sair2 (handles); set(Processamento, 'Visible', 'Off'); set(Transformacao, 'Visible', 'On'); end % -------------------------------------------------------------------function transformacao1_Callback(hObject, eventdata, handles) % hObject handle to transformacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro1)==0 || length(img_filtro2)==0) set(Processamento, 'Visible', 'Off'); set(transformacao1, 'Visible', 'On'); else sair1 (handles); sair2 (handles); set(Processamento, 'Visible', 'Off'); set(transformacao1, 'Visible', 'On'); end %*************************** FIM MENUS OPEÇÕES **************************** %************************************************************************** %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %**************************** Botões 1ª Imagem **************************** %************************************************************************** % --- Executes on button press in Botao1. function Botao1_Callback(hObject, eventdata, handles) % hObject handle to Botao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) set(handles.Botao10, 'Visible', 'On'); set(handles.Botao11, 'Visible', 'On'); set(handles.Botao13, 'Visible', 'On');

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

29


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial img_filtro1 = Contraste(img_orig); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); else x= rgb2gray(img_orig); img_filtro1 = Contraste(x); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao2. function Botao2_Callback(hObject, eventdata, handles) % hObject handle to Botao2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) set(handles.Botao10, 'Visible', 'On'); set(handles.Botao11, 'Visible', 'On'); set(handles.Botao13, 'Visible', 'On'); img_filtro2 = Histograma(img_orig); axes(handles.filtro1); imshow(img_filtro2); set(handles.filtro1,'UserData',img_filtro2); axis off; guidata(hObject, handles); else x = rgb2gray(img_orig); img_filtro2 = Histograma(x); axes(handles.filtro1); imshow(img_filtro2); set(handles.filtro1,'UserData',img_filtro2); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao3. function Botao3_Callback(hObject, eventdata, handles) % hObject handle to Botao3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) msgbox('O Filtro não pode ser aplicado a Imagens a Preto e Branco','Info','help'); else img_filtro3 = butterworthreject(img_orig,0.01,0.2,2); axes(handles.filtro1); imshow(img_filtro3); set(handles.filtro1,'UserData',img_filtro3); axis off; guidata(hObject, handles); end end

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

30


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % --- Executes on button press in Botao4. function Botao4_Callback(hObject, eventdata, handles) % hObject handle to Botao4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) set(handles.Botao10, 'Visible', 'On'); set(handles.Botao11, 'Visible', 'On'); set(handles.Botao13, 'Visible', 'On'); img_filtro4 = medfilt2(img_orig,[10 10]); axes(handles.filtro1); imshow(img_filtro4); set(handles.filtro1,'UserData',img_filtro4); axis off; guidata(hObject, handles); else x = rgb2gray(img_orig); img_filtro4 = medfilt2(x,[10 10]); axes(handles.filtro1); imshow(img_filtro4); set(handles.filtro1,'UserData',img_filtro4); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao5. function Botao5_Callback(hObject, eventdata, handles) % hObject handle to Botao5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) set(handles.Botao10, 'Visible', 'On'); set(handles.Botao11, 'Visible', 'On'); set(handles.Botao13, 'Visible', 'On'); img_filtro1=Thresold (img_orig); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); else x= rgb2gray(img_orig); img_filtro1=Thresold (x); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao6. function Botao6_Callback(hObject, eventdata, handles) % hObject handle to Botao6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) set(handles.Botao10, 'Visible', 'On');

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

31


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial set(handles.Botao11, 'Visible', 'On'); set(handles.Botao13, 'Visible', 'On'); img_filtro1=Fourier(img_orig); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; set(handles.Botao10, 'Visible', 'Off'); set(handles.Botao11, 'Visible', 'Off'); set(handles.Botao13, 'Visible', 'Off'); guidata(hObject, handles); else x= rgb2gray(img_orig); img_filtro1=Fourier(x); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao7. function Botao7_Callback(hObject, eventdata, handles) % hObject handle to Botao7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) img_filtro1=FourierShift(img_orig); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; set(handles.Botao10, 'Visible', 'Off'); set(handles.Botao11, 'Visible', 'Off'); set(handles.Botao13, 'Visible', 'Off'); guidata(hObject, handles); else x= rgb2gray(img_orig); img_filtro1=FourierShift(x); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao8. function Botao8_Callback(hObject, eventdata, handles) % hObject handle to Botao8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.LimiteInferior,'String')); temp1 = str2num(get(handles.LimiteSuperior,'String')); if (length(temp1) == 0 || length(temp) == 0 || ~isreal(temp) || ~isreal(temp1)) msgbox('Introduza Limites','Info','help'); else lim_Sup = handles.l_Sup1; lim_Inf = handles.l_Inf1; img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Abrir Imagem?','Info','help'); else if (isgray(img_orig) == 1 || isbw(img_orig) == 1) img_filtro1 = PassaBanda(img_orig,lim_Inf,lim_Sup); axes(handles.filtro1);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

32


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off ; guidata(hObject, handles); else x= rgb2gray(img_orig); img_filtro1 = PassaBanda(x,lim_Inf,lim_Sup); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off ; guidata(hObject, handles); end end end

%************************** FIM Botões Imagem 1 *************************** %************************************************************************** % --- Executes on button press in Botao10. function Botao10_Callback(hObject, eventdata, handles) % hObject handle to Botao10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else fff = Contraste(img_filtro1); img_filtro7 = imadjust(fff,[],[],0.9); axes(handles.filtro2); imshow(img_filtro7); set(handles.filtro2,'UserData',img_filtro7); axis off ; end % --- Executes on button press in Botao11. function Botao11_Callback(hObject, eventdata, handles) % hObject handle to Botao11 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro8 = Histograma(img_filtro1); axes(handles.filtro2); imshow(img_filtro8); set(handles.filtro2,'UserData',img_filtro8); axis off; end % --- Executes on button press in Botao12. function Botao12_Callback(hObject, eventdata, handles) % hObject handle to Botao12 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else if (isgray(img_filtro1) == 1 || isbw(img_filtro1) == 1) msgbox('O Filtro não pode ser aplicado a Imagens a Preto e Branco','Info','help'); else img_filtro9 = butterworthreject(img_filtro1,0.01,0.1,2); axes(handles.filtro2); imshow(img_filtro9); set(handles.filtro2,'UserData',img_filtro9);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

33


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial axis off; end end % --- Executes on button press in Botao13. function Botao13_Callback(hObject, eventdata, handles) % hObject handle to Botao13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else ff = medfilt2(img_filtro1,[20 15]); img_filtro10 = imadjust(ff,[],[],1); axes(handles.filtro2); imshow(img_filtro10); set(handles.filtro2,'UserData',img_filtro10); axis off; end % --- Executes on button press in Botao14. function Botao14_Callback(hObject, eventdata, handles) % hObject handle to Botao14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro14=Thresold (img_filtro1); axes(handles.filtro2); imshow(img_filtro14); set(handles.filtro2,'UserData',img_filtro14); axis off ; end % --- Executes on button press in Boato15. function Boato15_Callback(hObject, eventdata, handles) % hObject handle to Boato15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro15=Fourier(img_filtro1); axes(handles.filtro2); imshow(img_filtro15); set(handles.filtro2,'UserData',img_filtro15); axis off ; end % --- Executes on button press in Boato16. function Boato16_Callback(hObject, eventdata, handles) % hObject handle to Boato16 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro16=FourierShift(img_filtro1); axes(handles.filtro2); imshow(img_filtro16); set(handles.filtro2,'UserData',img_filtro16); axis off ; end

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

34


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % --- Executes on button press in Boato17. function Boato17_Callback(hObject, eventdata, handles) % hObject handle to Boato17 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp2 = str2num(get(handles.LimiteInferior1,'String')); temp3 = str2num(get(handles.LimiteSuperior1,'String')); if (length(temp3) == 0 || length(temp2) == 0 || ~isreal(temp2)|| ~isreal(temp3)) msgbox('Introduza Limites','Info','help'); elseif temp3 < temp2 msgbox('O Limite Superior tem de ser superior ao limite Inferior','Info','help'); else lim_Sup = handles.l_Sup2; lim_Inf = handles.l_Inf2; img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Abrir Imagem?','Info','help'); else if (isgray(img_filtro1) == 1 || isbw(img_filtro1) == 1) msgbox('O Filtro não pode ser aplicado a Imagens a Preto e Branco','Info','help'); else x= rgb2gray(img_filtro1); img_filtro17 = PassaBanda(x,lim_Inf,lim_Sup); axes(handles.filtro2); imshow(img_filtro17); set(handles.filtro2,'UserData',img_filtro17); axis off ; guidata(hObject, handles); end end end %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %************************** FIM Botões Imagem 2 *************************** %************************************************************************** %**************************** Caixas de Texto ***************************** %************************************************************************** function LimiteSuperior_Callback(hObject, eventdata, handles) % hObject handle to LimiteSuperior (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of LimiteSuperior as text % str2double(get(hObject,'String')) returns contents of LimiteSuperior as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para O Limite Superior','Info','help'); end else handles.l_Sup1=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function LimiteSuperior_CreateFcn(hObject, eventdata, handles) %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function LimiteInferior_Callback(hObject, eventdata, handles) % hObject handle to LimiteInferior (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

35


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

% Hints: get(hObject,'String') returns contents of LimiteInferior as text % str2double(get(hObject,'String')) returns contents of LimiteInferior as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para O Limite Inferior','Info','help'); end else handles.l_Inf1=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function LimiteInferior_CreateFcn(hObject, eventdata, handles) %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function LimiteSuperior1_Callback(hObject, eventdata, handles) % hObject handle to LimiteSuperior1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of LimiteSuperior1 as text % str2double(get(hObject,'String')) returns contents of LimiteSuperior1 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para O Limite Superior','Info','help'); end else handles.l_Sup2=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function LimiteSuperior1_CreateFcn(hObject, eventdata, handles) function LimiteInferior1_Callback(hObject, eventdata, handles) % hObject handle to LimiteInferior1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of LimiteInferior1 as text % str2double(get(hObject,'String')) returns contents of LimiteInferior1 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para O Limite Inferior','Info','help'); end else handles.l_Inf2=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function LimiteInferior1_CreateFcn(hObject, eventdata, handles)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

36


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

3.3.

FICHEIRO “TRANSFORMACAO.M”

function varargout = Transformacao(varargin) % TRANSFORMACAO M-file for Transformacao.fig % TRANSFORMACAO, by itself, creates a new TRANSFORMACAO or raises the existing % singleton*. % % H = TRANSFORMACAO returns the handle to a new TRANSFORMACAO or the handle to % the existing singleton*. % % TRANSFORMACAO('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in TRANSFORMACAO.M with the given input arguments. % % TRANSFORMACAO('Property','Value',...) creates a new TRANSFORMACAO or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Transformacao_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Transformacao_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Transformacao % Last Modified by GUIDE v2.5 16-Jun-2011 16:43:27 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Transformacao_OpeningFcn, ... 'gui_OutputFcn', @Transformacao_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before Transformacao is made visible. function Transformacao_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Transformacao (see VARARGIN) %Limpar dados anteriores caso existam clc; clear workspace; % Inicializar a aplicação (limpar imagens) InitImageFig(handles); % Choose default command line output for Transformacao handles.output = hObject;

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

37


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

% Update handles structure guidata(hObject, handles); % UIWAIT makes Transformacao wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = Transformacao_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; function InitImageFig(handles) set(handles.transformacao, 'Visible', 'Off'); img=ones(10,10,3); axes(handles.image_original); imagesc(img); axis off ; img1=ones(10,10,3); axes(handles.filtro1); imagesc(img1); axis off ; img2=ones(10,10,3); axes(handles.filtro2); imagesc(img2); axis off ; Abre1('imagem1.jpg','@',handles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ShowImageFile(filename,pathname,handles) if ~isequal(filename, 0) fn=strcat(pathname,filename); img_ori=rgb2gray(imread(fn)); axes(handles.image_original); imshow(img_ori); set(handles.image_original,'UserData',img_ori); end function Abre1(filename,pathname,handles) if ~isequal(filename, 0) fn=strcat(pathname,filename); img_ori=imread(fn); axes(handles.image_original); imshow(img_ori); set(handles.image_original,'UserData',img_ori); end %*********************** MENUS DO SISTEMA FICHEIRO ************************ %************************************************************************** % -------------------------------------------------------------------function Ficheiro_Callback(hObject, eventdata, handles)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

38


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % hObject % eventdata

handle to Ficheiro (see GCBO) reserved - to be defined in a future version of MATLAB

% handles

structure with handles and user data (see GUIDATA)

% -------------------------------------------------------------------function Abrir_Callback(hObject, eventdata, handles) % hObject handle to Abrir (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Arir um ficheiro de imagem do disco do PC. [filename,pathname] = uigetfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff'},'Abrir Imagem:'); ShowImageFile(filename,pathname,handles); axis off ; % -------------------------------------------------------------------function Guardar1_Callback(hObject, eventdata, handles) % hObject handle to Guardar1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem Para Gravar','Info','help'); else [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','1º Transformação Imagem 1'); if isequal(filename,0) || isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro1, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Guardar2_Callback(hObject, eventdata, handles) % hObject handle to Guardar2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro2)==0) msgbox('Sem Imagem Para Gravar','Info','help'); else [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','2º Transformação Imagem 1'); if isequal(filename,0) || isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro2, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Sair_Callback(hObject, eventdata, handles) % hObject handle to Sair (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) closereq; set(Inicial, 'Visible', 'On');

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

39


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial %*************************** FIM MENUS SISTEMAS FICHEIROS ***************** %************************************************************************** %**************************** MENUS DAS TÉCNICAS ************************** %************************************************************************** % -------------------------------------------------------------------function tecnicas_Callback(hObject, eventdata, handles) % hObject handle to tecnicas (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % -------------------------------------------------------------------function preprocessamento_Callback(hObject, eventdata, handles) % hObject handle to preprocessamento (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %set(Main, 'Visible', 'Off'); set(Transformacao, 'Visible', 'Off'); set(Processamento, 'Visible', 'On'); guidata(hObject, handles);

% -------------------------------------------------------------------function transformacao_Callback(hObject, eventdata, handles) % hObject handle to transformacao (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %set(Main, 'Visible', 'Off');

% -------------------------------------------------------------------function Transformacao1_Callback(hObject, eventdata, handles) % hObject handle to Transformacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(Transformacao, 'Visible', 'Off'); set(Transformacao1, 'Visible', 'On');

%*************************** FIM MENUS OPEÇÕES **************************** %************************************************************************** %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %**************************** Botões 1ª Imagem **************************** %************************************************************************** % --- Executes on button press in Botao1. function Botao1_Callback(hObject, eventdata, handles) % hObject handle to Botao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Rotacao,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza um Ângulo','Info','help'); else rot = handles.angulo; img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Abrir Imagem?','Info','help'); else img_filtro1 = imrotate(img_orig,rot,'bilinear'); axes(handles.filtro1); imshow(img_filtro1);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

40


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial set(handles.filtro1,'UserData',img_filtro1); axis off ; guidata(hObject, handles); end end % --- Executes on button press in Botao2. function Botao2_Callback(hObject, eventdata, handles) % hObject handle to Botao2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else T = maketform('affine',[.5 0 0; .5 2 0; 0 0 1]); tformfwd([10 20],T); img_filtro2 = imtransform(img_orig,T); axes(handles.filtro1); imshow(img_filtro2); set(handles.filtro1,'UserData',img_filtro2); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao5. function Botao3_Callback(hObject, eventdata, handles) % hObject handle to Botao5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Escala1,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza a Escala','Info','help'); else escala1 = handles.escala; img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro3 = imresize(img_orig, escala1); axes(handles.filtro1); imshow(img_filtro3); set(handles.filtro1,'UserData',img_filtro3); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao4. function Botao4_Callback(hObject, eventdata, handles) % hObject handle to Botao4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro4 = bwlabel(img_orig, 4); axes(handles.filtro1); imshow(img_filtro4); set(handles.filtro1,'UserData',img_filtro4); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao5. function Botao5_Callback(hObject, eventdata, handles) % hObject handle to Botao5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

41


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro5 = edge(img_orig); axes(handles.filtro1); imshow(img_filtro5); set(handles.filtro1,'UserData',img_filtro5); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao6. function Botao6_Callback(hObject, eventdata, handles) % hObject handle to Botao6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else conformal = maketform('custom', 2, 2, [], @conformalInverse, []); uData = [ -1.25 1.25]; % Bounds for REAL(w) vData = [ 0.75 -0.75]; % Bounds for IMAG(w) xData = [ -2.4 2.4 ]; % Bounds for REAL(z) yData = [ 2.0 -2.0 ]; % Bounds for IMAG(z) img_filtro6 = imtransform( img_orig, conformal, 'cubic', ... 'UData', uData,'VData', vData,... 'XData', xData,'YData', yData,... 'Size', [300 360], 'FillValues', 255 ); axes(handles.filtro1); imshow(img_filtro6); set(handles.filtro1,'UserData',img_filtro6); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao7. function Botao7_Callback(hObject, eventdata, handles) % hObject handle to Botao7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else threshold = graythresh(img_orig); bw = im2bw(img_orig,threshold); bw = bwareaopen(bw,30); se = strel('disk',2); bw = imclose(bw,se); bw = imfill(bw,'holes'); img_filtro7 = bw; axes(handles.filtro1); imshow(img_filtro7); set(handles.filtro1,'UserData',img_filtro7); axis off; guidata(hObject, handles); end %************************** FIM Botões 1ª Imagem ************************** %************************************************************************** %**************************** Botões 2ª Imagem **************************** %************************************************************************** % --- Executes on button press in Boao10. function Boao10_Callback(hObject, eventdata, handles) % hObject handle to Boao10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

42


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial temp = str2num(get(handles.Rotacao1,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza um Ângulo','Info','help'); else rot = handles.angulo1; img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Abrir Imagem?','Info','help'); else img_filtro10 = imrotate(img_filtro1,rot,'bilinear'); axes(handles.filtro2); imshow(img_filtro10); set(handles.filtro2,'UserData',img_filtro10); axis off ; guidata(hObject, handles); end end % --- Executes on button press in Botao11. function Botao11_Callback(hObject, eventdata, handles) % hObject handle to Botao11 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else T = maketform('affine',[.5 0 0; .5 2 0; 0 0 1]); tformfwd([10 20],T); img_filtro11 = imtransform(img_filtro1,T); axes(handles.filtro2); imshow(img_filtro11); set(handles.filtro2,'UserData',img_filtro11); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao12. function Botao12_Callback(hObject, eventdata, handles) % hObject handle to Botao12 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Escala2,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza a Escala','Info','help'); else escala1 = handles.escala1; img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro12 = imresize(img_filtro1, escala1); axes(handles.filtro2); imshow(img_filtro12); set(handles.filtro2,'UserData',img_filtro12); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao13. function Botao13_Callback(hObject, eventdata, handles) % hObject handle to Botao13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro13 = bwlabel(img_filtro1, 4); axes(handles.filtro2);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

43


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial imshow(img_filtro13); set(handles.filtro2,'UserData',img_filtro13); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao14. function Botao14_Callback(hObject, eventdata, handles) % hObject handle to Botao14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro14 = edge(img_filtro1); axes(handles.filtro2); imshow(img_filtro14); set(handles.filtro2,'UserData',img_filtro14); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao15. function Botao15_Callback(hObject, eventdata, handles) % hObject handle to Botao15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else conformal = maketform('custom', 2, 2, [], @conformalInverse, []); uData = [ -1.25 1.25]; % Bounds for REAL(w) vData = [ 0.75 -0.75]; % Bounds for IMAG(w) xData = [ -2.4 2.4 ]; % Bounds for REAL(z) yData = [ 2.0 -2.0 ]; % Bounds for IMAG(z) img_filtro15 = imtransform( img_filtro1, conformal, 'cubic', ... 'UData', uData,'VData', vData,... 'XData', xData,'YData', yData,... 'Size', [300 360], 'FillValues', 255 ); axes(handles.filtro2); imshow(img_filtro15); set(handles.filtro2,'UserData',img_filtro15); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao16. function Botao16_Callback(hObject, eventdata, handles) % hObject handle to Botao16 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else threshold = graythresh(img_filtro1); bw = im2bw(img_filtro1,threshold); bw = bwareaopen(bw,30); se = strel('disk',2); bw = imclose(bw,se); bw = imfill(bw,'holes'); img_filtro16 = bw; axes(handles.filtro2); imshow(img_filtro16); set(handles.filtro2,'UserData',img_filtro16); axis off; guidata(hObject, handles); end

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

44


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial %************************** FIM Botões Imagem 2 *************************** %************************************************************************** %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %**************************** Caixas de Testo ***************************** %************************************************************************** function Rotacao_Callback(hObject, eventdata, handles) % hObject handle to Rotacao (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Rotacao as text % str2double(get(hObject,'String')) returns contents of Rotacao as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para o Ângulo','Info','help'); end else handles.angulo=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function Rotacao_CreateFcn(hObject, eventdata, handles) function Escala1_Callback(hObject, eventdata, handles) % hObject handle to Escala1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Escala1 as text % str2double(get(hObject,'String')) returns contents of Escala1 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para a Escala','Info','help'); end else if (temp >=0 && temp <= 2) handles.escala=temp; guidata(hObject, handles); else msgbox('Valores devem estar entre 0 e 2!','Info','help'); end end % --- Executes during object creation, after setting all properties. function Escala1_CreateFcn(hObject, eventdata, handles)

function Rotacao1_Callback(hObject, eventdata, handles) % hObject handle to Rotacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Rotacao1 as text % str2double(get(hObject,'String')) returns contents of Rotacao1 as a double temp = str2num(get(hObject,'String'));

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

45


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para o Ângulo','Info','help'); end else handles.angulo1=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function Rotacao1_CreateFcn(hObject, eventdata, handles)

function Escala2_Callback(hObject, eventdata, handles) % hObject handle to Escala2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Escala2 as text % str2double(get(hObject,'String')) returns contents of Escala2 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para a Escala','Info','help'); end else if (temp >=0 && temp <= 2) handles.escala1=temp; guidata(hObject, handles); else msgbox('Valores devem estar entre 0 e 2!','Info','help'); end end % --- Executes during object creation, after setting all properties. function Escala2_CreateFcn(hObject, eventdata, handles)

3.4.

FICHEIRO “TRANSFORMAÇÃO1.M”

function varargout = Transformacao1(varargin) % TRANSFORMACAO1 M-file for transformacao1.fig % TRANSFORMACAO1, by itself, creates a new TRANSFORMACAO1 or raises the existing % singleton*. % % H = TRANSFORMACAO1 returns the handle to a new TRANSFORMACAO1 or the handle to % the existing singleton*. % % TRANSFORMACAO1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in TRANSFORMACAO1.M with the given input arguments. % % TRANSFORMACAO1('Property','Value',...) creates a new TRANSFORMACAO1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Transformacao1_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Transformacao1_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help transformacao1

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

46


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

% Last Modified by GUIDE v2.5 16-Jun-2011 17:00:48 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Transformacao1_OpeningFcn, ... 'gui_OutputFcn', @Transformacao1_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before transformacao1 is made visible. function Transformacao1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to transformacao1 (see VARARGIN) %Limpar dados anteriores caso existam clc; clear workspace; % Inicializar a aplicação (limpar imagens) InitImageFig(handles); % Choose default command line output for transformacao1 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes transformacao1 wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = Transformacao1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; function InitImageFig(handles) set(handles.transformacao1, 'Visible', 'Off'); img=ones(10,10,3); axes(handles.image_original);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

47


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial imagesc(img); axis off ; img1=ones(10,10,3); axes(handles.filtro1); imagesc(img1); axis off ; img2=ones(10,10,3); axes(handles.filtro2); imagesc(img2); axis off ; Abre1('imagem2.jpg','@',handles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ShowImageFile(filename,pathname,handles) if ~isequal(filename, 0) fn=strcat(pathname,filename); img_ori=imread(fn); axes(handles.image_original); imshow(img_ori); set(handles.image_original,'UserData',img_ori); end function Abre1(filename,pathname,handles) if ~isequal(filename, 0) fn=strcat(pathname,filename); img_ori=imread(fn); axes(handles.image_original); imshow(img_ori); set(handles.image_original,'UserData',img_ori); end %*********************** MENUS DO SISTEMA FICHEIRO ************************ %************************************************************************** % -------------------------------------------------------------------function Ficheiro_Callback(hObject, eventdata, handles) % hObject handle to Ficheiro (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles

structure with handles and user data (see GUIDATA)

% -------------------------------------------------------------------function Abrir_Callback(hObject, eventdata, handles) % hObject handle to Abrir (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Arir um ficheiro de imagem do disco do PC. [filename,pathname] = uigetfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff'},'Abrir Imagem:'); ShowImageFile(filename,pathname,handles); axis off ; % -------------------------------------------------------------------function Guardar1_Callback(hObject, eventdata, handles) % hObject handle to Guardar1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem Para Gravar','Info','help'); else

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

48


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','1º Transformação Imagem 2'); if isequal(filename,0) || isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro1, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Guardar2_Callback(hObject, eventdata, handles) % hObject handle to Guardar2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro2)==0) msgbox('Sem Imagem Para Gravar','Info','help'); else [filename, pathname] = uiputfile({'*.jpg';'*.jpeg';'*.bmp';'*.tif';'*.tiff';'*.*'},'Guardar Imagem Como:','2º Transformação Imagem 2'); if isequal(filename,0) || isequal(pathname,0) msgbox('Sair Sem Gravar?','Info','help'); guidata(hObject, handles); else file = [pathname, filename, '']; imwrite(img_filtro2, file, 'jpg'); guidata(hObject, handles); end end % -------------------------------------------------------------------function Sair_Callback(hObject, eventdata, handles) % hObject handle to Sair (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) closereq; set(Inicial, 'Visible', 'On'); %*************************** FIM MENUS SISTEMAS FICHEIROS ***************** %************************************************************************** %**************************** MENUS DAS TÉCNICAS ************************** %************************************************************************** % -------------------------------------------------------------------function tecnicas_Callback(hObject, eventdata, handles) % hObject handle to tecnicas (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % -------------------------------------------------------------------function preprocessamento_Callback(hObject, eventdata, handles) % hObject handle to preprocessamento (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %set(Main, 'Visible', 'Off'); set(Transformacao1, 'Visible', 'Off'); set(Processamento, 'Visible', 'On'); guidata(hObject, handles);

% -------------------------------------------------------------------function transformacao_Callback(hObject, eventdata, handles)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

49


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % hObject handle to transformacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %set(Main, 'Visible', 'Off'); img_filtro1 = get(handles.filtro1,'Userdata'); img_filtro2 = get(handles.filtro2,'Userdata'); if (length(img_filtro1)==0 || length(img_filtro2)==0) set(Transformacao1, 'Visible', 'Off'); set(Transformacao, 'Visible', 'On'); else sair1 (handles); sair2 (handles); set(Transformacao1, 'Visible', 'Off'); set(Transformacao, 'Visible', 'On'); end % -------------------------------------------------------------------function transformacao1_Callback(hObject, eventdata, handles) % hObject handle to transformacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

%*************************** FIM MENUS OPEÇÕES **************************** %************************************************************************** %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %**************************** Botões 1ª Imagem **************************** %************************************************************************** % --- Executes on button press in Botao1. function Botao1_Callback(hObject, eventdata, handles) % hObject handle to Botao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Rotacao,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza um Ângulo','Info','help'); else rot = handles.angulo; img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Abrir Imagem?','Info','help'); else img_filtro1 = imrotate(img_orig,rot,'bilinear'); axes(handles.filtro1); imshow(img_filtro1); set(handles.filtro1,'UserData',img_filtro1); axis off ; guidata(hObject, handles); end end % --- Executes on button press in Botao2. function Botao2_Callback(hObject, eventdata, handles) % hObject handle to Botao2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else T = maketform('affine',[.5 0 0; .5 2 0; 0 0 1]); tformfwd([10 20],T); img_filtro2 = imtransform(img_orig,T); axes(handles.filtro1);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

50


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial imshow(img_filtro2); set(handles.filtro1,'UserData',img_filtro2); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao5. function Botao3_Callback(hObject, eventdata, handles) % hObject handle to Botao5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Escala1,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza a Escala','Info','help'); else escala1 = handles.escala; img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro3 = imresize(img_orig, escala1); axes(handles.filtro1); imshow(img_filtro3); set(handles.filtro1,'UserData',img_filtro3); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao4. function Botao4_Callback(hObject, eventdata, handles) % hObject handle to Botao4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro4 = bwlabel(img_orig, 4); axes(handles.filtro1); imshow(img_filtro4); set(handles.filtro1,'UserData',img_filtro4); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao5. function Botao5_Callback(hObject, eventdata, handles) % hObject handle to Botao5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro5 = edge(img_orig); axes(handles.filtro1); imshow(img_filtro5); set(handles.filtro1,'UserData',img_filtro5); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao6. function Botao6_Callback(hObject, eventdata, handles) % hObject handle to Botao6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0)

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

51


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial msgbox('Sem Imagem?','Info','help'); else conformal = maketform('custom', 2, 2, [], @conformalInverse, []); uData = [ -1.25 1.25]; % Bounds for REAL(w) vData = [ 0.75 -0.75]; % Bounds for IMAG(w) xData = [ -2.4 2.4 ]; % Bounds for REAL(z) yData = [ 2.0 -2.0 ]; % Bounds for IMAG(z) img_filtro6 = imtransform( img_orig, conformal, 'cubic', ... 'UData', uData,'VData', vData,... 'XData', xData,'YData', yData,... 'Size', [300 360], 'FillValues', 255 ); axes(handles.filtro1); imshow(img_filtro6); set(handles.filtro1,'UserData',img_filtro6); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao7. function Botao7_Callback(hObject, eventdata, handles) % hObject handle to Botao7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_orig = get(handles.image_original,'Userdata'); if (length(img_orig)==0) msgbox('Sem Imagem?','Info','help'); else threshold = graythresh(img_orig); bw = im2bw(img_orig,threshold); bw = bwareaopen(bw,30); se = strel('disk',2); bw = imclose(bw,se); bw = imfill(bw,'holes'); img_filtro7 = bw; axes(handles.filtro1); imshow(img_filtro7); set(handles.filtro1,'UserData',img_filtro7); axis off; guidata(hObject, handles); end %************************** FIM Botões 1ª Imagem ************************** %************************************************************************** %**************************** Botões 2ª Imagem **************************** %************************************************************************** % --- Executes on button press in Boao10. function Boao10_Callback(hObject, eventdata, handles) % hObject handle to Boao10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Rotacao1,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza um Ângulo','Info','help'); else rot = handles.angulo1; img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Abrir Imagem?','Info','help'); else img_filtro10 = imrotate(img_filtro1,rot,'bilinear'); axes(handles.filtro2); imshow(img_filtro10); set(handles.filtro2,'UserData',img_filtro10); axis off ; guidata(hObject, handles); end end % --- Executes on button press in Botao11.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

52


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial function Botao11_Callback(hObject, eventdata, handles) % hObject handle to Botao11 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else T = maketform('affine',[.5 0 0; .5 2 0; 0 0 1]); tformfwd([10 20],T); img_filtro11 = imtransform(img_filtro1,T); axes(handles.filtro2); imshow(img_filtro11); set(handles.filtro2,'UserData',img_filtro11); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao12. function Botao12_Callback(hObject, eventdata, handles) % hObject handle to Botao12 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) temp = str2num(get(handles.Escala2,'String')); if (length(temp) == 0 || ~isreal(temp)) msgbox('Introduza a Escala','Info','help'); else escala1 = handles.escala1; img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro12 = imresize(img_filtro1, escala1); axes(handles.filtro2); imshow(img_filtro12); set(handles.filtro2,'UserData',img_filtro12); axis off; guidata(hObject, handles); end end % --- Executes on button press in Botao13. function Botao13_Callback(hObject, eventdata, handles) % hObject handle to Botao13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro13 = bwlabel(img_filtro1, 4); axes(handles.filtro2); imshow(img_filtro13); set(handles.filtro2,'UserData',img_filtro13); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao14. function Botao14_Callback(hObject, eventdata, handles) % hObject handle to Botao14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else img_filtro14 = edge(img_filtro1); axes(handles.filtro2); imshow(img_filtro14); set(handles.filtro2,'UserData',img_filtro14);

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

53


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial axis off; guidata(hObject, handles); end % --- Executes on button press in Botao15. function Botao15_Callback(hObject, eventdata, handles) % hObject handle to Botao15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.filtro1,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else conformal = maketform('custom', 2, 2, [], @conformalInverse, []); uData = [ -1.25 1.25]; % Bounds for REAL(w) vData = [ 0.75 -0.75]; % Bounds for IMAG(w) xData = [ -2.4 2.4 ]; % Bounds for REAL(z) yData = [ 2.0 -2.0 ]; % Bounds for IMAG(z) img_filtro15 = imtransform( img_filtro1, conformal, 'cubic', ... 'UData', uData,'VData', vData,... 'XData', xData,'YData', yData,... 'Size', [300 360], 'FillValues', 255 ); axes(handles.filtro2); imshow(img_filtro15); set(handles.filtro2,'UserData',img_filtro15); axis off; guidata(hObject, handles); end % --- Executes on button press in Botao16. function Botao16_Callback(hObject, eventdata, handles) % hObject handle to Botao16 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) img_filtro1 = get(handles.image_original,'Userdata'); if (length(img_filtro1)==0) msgbox('Sem Imagem?','Info','help'); else threshold = graythresh(img_filtro1); bw = im2bw(img_filtro1,threshold); bw = bwareaopen(bw,30); se = strel('disk',2); bw = imclose(bw,se); bw = imfill(bw,'holes'); img_filtro16 = bw; axes(handles.filtro2); imshow(img_filtro16); set(handles.filtro2,'UserData',img_filtro16); axis off; guidata(hObject, handles); end

%************************** FIM Botões Imagem 2 *************************** %************************************************************************** %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %**************************** Caixas de Testo ***************************** %************************************************************************** function Rotacao_Callback(hObject, eventdata, handles) % hObject handle to Rotacao (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Rotacao as text

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

54


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % str2double(get(hObject,'String')) returns contents of Rotacao as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para o Ângulo','Info','help'); end else handles.angulo=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function Rotacao_CreateFcn(hObject, eventdata, handles) function Escala1_Callback(hObject, eventdata, handles) % hObject handle to Escala1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Escala1 as text % str2double(get(hObject,'String')) returns contents of Escala1 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para a Escala','Info','help'); end else if (temp >=0 && temp <= 2) handles.escala=temp; guidata(hObject, handles); else msgbox('Valores devem estar entre 0 e 2!','Info','help'); end end % --- Executes during object creation, after setting all properties. function Escala1_CreateFcn(hObject, eventdata, handles) function Rotacao1_Callback(hObject, eventdata, handles) % hObject handle to Rotacao1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of Rotacao1 as text % str2double(get(hObject,'String')) returns contents of Rotacao1 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para o Ângulo','Info','help'); end else handles.angulo1=temp; guidata(hObject, handles); end % --- Executes during object creation, after setting all properties. function Rotacao1_CreateFcn(hObject, eventdata, handles)

function Escala2_Callback(hObject, eventdata, handles) % hObject handle to Escala2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

55


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial % handles

structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of Escala2 as text % str2double(get(hObject,'String')) returns contents of Escala2 as a double temp = str2num(get(hObject,'String')); if (length(temp)==0 || ~isreal(temp)) if temp <0 msgbox('Introduza um número positivo','Info','help'); else msgbox('Introduza um valor para a Escala','Info','help'); end else if (temp >=0 && temp <= 2) handles.escala1=temp; guidata(hObject, handles); else msgbox('Valores devem estar entre 0 e 2!','Info','help'); end end % --- Executes during object creation, after setting all properties. function Escala2_CreateFcn(hObject, eventdata, handles)

3.5.

FICHEIRO “BUTTERWORTHHIGH.M”

function [out, H] = butterworthhigh (image,fc,q) im=im2double(image); im=rgb2gray(im); [co,ro] = size(im); cx = round(co/2); % find the center of the image cy = round (ro/2); imf=(fft2(im)); H=zeros(co,ro); for i = 1 : co for j =1 : ro d = (i-cx).^2 + (j-cy).^ 2; if d ~= 0 H(i,j) = 1/(1+((fc/d).^(2*q))); end; end; end; H = ifftshift(H); outf = imf .* H; out = abs(ifft2(outf));

3.6.

FICHEIRO “BUTTERWORTHLOW.M”

function [out, H] = butterworthlow (image,fc,q) im=im2double(image); im=rgb2gray(im); [co,ro] = size(im); cx = round(co/2); % find the center of the image cy = round (ro/2); imf=(fft2(im)); H=zeros(co,ro); for i = 1 : co for j =1 : ro d = (i-cx).^2 + (j-cy).^ 2; H(i,j) = 1/(1+((d/fc).^(2*q)));

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

56


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial end; end; H = ifftshift(H); outf = imf .* H; out = abs(ifft2(outf));

3.7.

FICHEIRO “BUTTERWORTHREJECT.M”

function [m]=butterworthreject(image,fc1,fc2,q) image=im2double(image); h = butterworthhigh(image,fc2,q); j = butterworthlow(image,fc1,q); m=h+j;

3.8.

FICHEIRO “CONTRASTE.M”

% dar contraste para melhorar a imagem function [cont]=Contraste(img) hcontadj = vision.ContrastAdjuster; cont = step(hcontadj, img); end

3.9.

FICHEIRO “FOURIER.M”

function [Y2] = Fourier(A) Y2=fft2(A);

3.10.

FICHEIRO “FOURIERSHIFT.M”

function [Y2] = FourierShift(A) B=fft2(A); F=angle(B); Y2=fftshift(B);

3.11.

FICHEIRO “HISTOGRAMA.M”

% dar contraste para melhorar a imagem function [hist] = Histograma(img) hhisteq = vision.HistogramEqualizer; hist = step(hhisteq, img); end

3.12.

FICHEIRO “PASSABANDA.M”

function [img]=Passabanda(imagem,c1,c2) H=imagem; for u=1 : length(H) for v=1 : length(H) r=round(sqrt((u-20.5)^2+(v-20.5)^2)); if (r>c1) && (r<c2) H(u,v)=0;

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

57


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial end end end img=H;

3.13.

FICHEIRO “THRESHOLD.M”

function [g] = Thresold (f) %f=imread('moon.tif'); f=mat2gray(f); g=f;th=0.8; [r,c]=find(f>th); for k=1:length(r) g(r(k),c(k))=1; end %for k=1:length(r),g(r(k),c(k))=255;end [r,c]=find(f<=th); for k=1:length(r) g(r(k),c(k))=0; end

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

58


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

4. CONCLUSÕES Para a realização deste trabalho, num primeiro momento realizou-se uma aprofundada pesquisa e estudo dos temos abordados. De acordo com as imagens escolhidas para este trabalho, o primeiro passo foi identificar e escolher em cada uma delas quais as operações de pré-processamento a executar de forma a obter uma melhoria visível em cada uma das imagens. Posteriormente, desenvolveu-se um programa em Matlab com interface gráfico onde o utilizador pode aplicar várias técnicas isoladas ou combinadas a uma imagem previamente carregada. Além disto, possibilitou-se ainda a aplicação de várias transformações quer a uma imagem carregada quer ao resultado de pré-processamentos anteriores. Relativamente às funções implementadas, utilizaram-se algumas das programadas nas aulas práticas, e outras do pacote de processamento de imagem do Matlab. Consideramos que este trabalho foi muito útil para compreender, não só como é realizada a representação de imagens digitais, mas também a vantagem do tratamento destas através da aplicação de técnicas de pré-processamento. Com todos os objectivos propostos para este trabalho cumpridos, avalia-se de forma muito positiva todo o conhecimento adquirido, que enriqueceu os conhecimentos relativamente à manipulação e tratamento de imagem usando o Matlab.

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

59


Instituto Politécnico de Viseu

Escola Superior de Tecnologia e Gestão de Viseu Mestrado em Engenharia Electrotécnica - Energia e Automação Industrial

5. BIBLIOGRAFIA Image Processing Toolbox User’s Guide. (2004). The MathWorks, Inc. Gonzales, R., & Woods, R. (s.d.). Digital Image Processing. Prentice Hall. Kamen, E., & Heck, B. (s.d.). Fundamentals of Signals and Systems Using Matlab. Prentice Hall. Portes de Albuquerque, M., & Portes de Albuquerque, M. (s.d.). Processamento de Imagens: Métodos e Análises. Centro Brasileiro de Pesquisas Físicas – CBPF/MCT. Pratt, W. (2001). Digital Image Processing: PIKS Inside. John Wiley & Sons, Inc. Sonka, M., Hlavac, V., & Boyle, R. (2008). Image Processing, Analysis, and Machine Vision, International Student Edition . Canada : Thomson Learning .

João Vitor Pereira Ôlas (nº1503) Ricardo Jorge de Loureiro Silva (nº1841) Augusto José Casais (nº3162)

60


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.