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