Laboratório de Programação II - Turma 490
Horários: 2AB e 4CD

Prof. Márcio Sarroglia Pinho

Aula sobre Manipulação de Imagens

 


O objetivo desta aula é testar algoritmos de manipulação de imagens. As imagens serão carregadas e editadas através da classe ImageClass.

Caso você nunca tenha usado esta biblioteca, acesse a página da mesma e realize alguns testes.

Exercícios

Atenção: Antes de iniciar, lembre-se  de abrir o projeto Imagens.cbp no Code::Blocks.


1) Abra o arquivo
ExemploDeManipulacaoDeImagens.cpp.
Observe o funcionamento da função void ConvertBlackAndWhite(). Nesta função a imagem é varrida pixel a pixel e a intensidade (tom de cinza) do pixel é obtido através da função GetPointIntensity. Caso este valor seja menor que um LIMIAR, a imagem da direita recebe um ponto preto.
Caso este valor seja maior que um LIMIAR, a imagem da direita recebe um ponto branco.
Esta função é ativada pela tecla '2'.
Altere o valor da constante LIMIAR e veja o resultado. Escolha valores entre 10 e 150.
Teste com outras imagens que estão na pasta do programa.


2) Observe o funcionamento da função void ConvertToGrayscale(). Nesta função a imagem é varrida pixel a pixel e a intensidade (tom de cinza) do pixel é obtido através da função GetPointIntensity(). O valor obtido é usado para definir a cor do ponto na imagem da direita. Quando numa imagem os valores de R, G e B de um ponto são iguais, a cor do ponto é cinza.
Esta função é ativada  pela tecla 'g'.
Teste com outras imagens que estão na pasta do programa.

3) Seguindo o exemplo de acesso aos pixels da imagem apresentado na função ConvertBlackAndWhite, crie uma função void InvertImage() que inverta a imagem de cabeça para baixo.
Ative a função a partir da tecla 'i'.
Veja a seção "Tratador de evento de teclado" para saber como utilizar a tecla. Teste com a imagem Colegio.png.

4) Crie uma função void DetectImageBorders() que determina onde estão as bordas de uma imagem
. A ideia central do algortimo de detecção de bordas é calcular a diferença de cor de um pixel e a cor de seu vizinho. Se esta diferença for mais que um certo limite, então há uma borda. Senão, não há. Sempre que houver uma borda, um ponto deve ser desenhado na imagem da direita.
Teste com a imagem Falcao.jpg.
Para testar a diferença entre dois pontos, pode-se usar algumas métricas, entre elas:
- diferenças entre os tons de cinza(intesnsidades) dos pontos vizinhos;
- diferenças entre as cores RGB:

Em ambos os casos, é preciso testar as os vizinhos na vertical e na horizontal.
Atenção: Ao varrer a imagem, tome cuidado para não acessar pontos fora dos limites da imagem.
Ative a função a partir da tecla 'b'.
 
5) Crie uma função para remover ruídos de uma imagem. Uma das técnicas que pode ser usada para a remoção de ruído é o Filtro da Mediana. A ideia central do algoritmo é pegar os pontos ao redor de um ponto, colocar as intersidades em ordem e obter a mediana destes dados ordenados. A nova cor do ponto será a mediana. As imagens a seguir exemplificam o resultado do algoritmo.


Figura - Exemplo de Aplicação do Filtro da Mediana

Considerando que se utilize uma janela de 3x3 ao redor de um ponto teremos 9 números. Colocando este dados em um vetor, pode-se ordená-los através do seguinte trecho de código.

void OrdenaVetor(int window[])
{
    int temp, i , j;
    for(i = 0; i < 9; i++){
        temp = window[i];
        for(j = i-1; j >= 0 && temp < window[j]; j--){
            window[j+1] = window[j];
        }
        window[j+1] = temp;
    }
}

Para aplicar o algoritmo da Mediana, uma possibilidade é utilizar este algortimo.

int Vetor[9];
MontaVetor(x,y, Vetor); // Coloca em VETOR os valores das intensidades ao redor do ponto X,Y.
OrdenaVetor(Vetor);
Mediana = Vetor[5]
NewImage.DrawPixel(x,y,Mediana, Mediana, Mediana);

Crie a a função MontaVetor para obter os pontos ao redor de um ponto X,Y.
Teste o algoritmo com as imagens Ruido1.bmp, Ruido2.bmp e  Ruido1.bmp.
Ative a função a partir da tecla 'm'.

Atenção: Ao varrer a imagem, tome cuidado para não acessar pontos fora dos limites da imagem.


6) Carregue uma das iamgens disponíveis nestes link, monte o histograma e exiba o resultado em uma imagem ao lado da imagem carregada. Note que será necessário ajustar a largura e a altura do gráfico ao tamanho da imagem escolhida para exibir o histograma. A figura a seguir exemplifica o histograma de uma das imagens.


Figura - Exemplo de Histograma

7) Crie um algoritmo para aplicar remoção de ruído no histograma, usando o método da mediana, utilizado no exercício 5, com uma janela de 5, 7 e 9 valores.
A figura a seguir exemplifica o resultado da remoção de ruído no histograma de uma das imagens.



Figura - Exemplo de Aplicação do Filtro da Mediana no Histograma



-------------------
FIM