Skip to content

Latest commit

 

History

History
260 lines (173 loc) · 9.19 KB

File metadata and controls

260 lines (173 loc) · 9.19 KB

Processamento Digital de Imagens Exercicios

Vitor Ramos <ramos.vitor89@gmail.com>

Manipulando pixels em uma imagem

Regiões

Implementar de um programa que deverá solicitar ao usuário as coordenadas de dois pontos \$P_1\$ e \$P_2\$ localizados dentro dos limites do tamanho da imagem que lhe for fornecida e exibir. Entretanto, a região definida pelo retângulo de vértices opostos definidos pelos pontos \$P_1\$ e \$P_2\$ será exibida com o negativo da imagem na região correspondente.

O codigo
link:Regioes//main.cpp[role=include]
Imagem Original

biel

Resultado

resultado

Troca regiões

Implementar um programa que deverar trocar aleatoriamente regiões da imagem, formando uma espécie de quebra-cabeças. Explore o uso da classe Mat e seus construtores para criar as regiões que serão trocadas. O efeito é ilustrado na Figura Troca de regiões.

O codigo
link:TrocaRegioes//main.cpp[role=include]
Imagem Original

abc

Resultado 1

resultado

Resultado 2

resultado2

Preenchendo regiões

Contando objetos problema

Observando-se o programa labeling.cpp como exemplo, é possível verificar que caso existam mais de 255 objetos na cena, o processo de rotulação poderá ficar comprometido. Identifique a situação em que isso ocorre e proponha uma solução para este problema.

Solucao : Isso ocorre porque para cada objeto é atribuido um valor de cinza, se a imagem tive mais de 255 objetos o programa vai atribuir valores invalidos de cinza pois a imagem só possui 8 bits, a solução é fixar o valor de cinza dos objetos encontrados assim o programa podera classificar quantos objetos tiver na imagem.

Codigo Modificado
link:ContaObjeto//main.cpp[role=include]
Imagem Original

abc

Resultado

resultado

Contando objetos com buracos

Aprimoração do algoritmo de contagem apresentado para identificar regiões com ou sem buracos internos. Assumindo que objetos com mais de um buraco podem existir. Incluindo suporte no seu algoritmo para não contar bolhas que tocam as bordas da imagem.

O Codigo
link:ContaBuraco//main.cpp[role=include]
Resultado

resultado Para testar o codigo foram criados objetos com mais de um buraco e o programa contou ele apenas uma vez como esperado

Manipulação de histogramas

Equalizador histograma

Utilizando o programa exemplos/histogram.cpp como referência. Implemente um programa equalize.cpp. Este deverá, para cada imagem capturada, realizar a equalização do histogram antes de exibir a imagem.

o programa a seguir equaliza os 3 canais de cores RGB individualmente

O Codigo
link:HistogramaEqualizacao//main.cpp[role=include]
Resultado utilizando 64 beans

resultado64beans

Resultados utilizando 256 beans

resultado256beans resultado256 2beans

é possivel obervar a homogeneização do histograma e as cores mais vivas

Detecção de movimento

Utilizando o programa exemplos/histogram.cpp como referência, implemente um programa motiondetector.cpp. Este deverá continuamente calcular o histograma da imagem (apenas uma componente de cor é suficiente) e compará-lo com o último histograma calculado. Quando a diferença entre estes ultrapassar um limiar pré-estabelecido, ative um alarme. Utilize uma função de comparação que julgar conveniente.

O programa utiliza apenas o canal R para calcular a diferença do histograma, e a diferença e calculada pela função chi-quadrado \$\sum_{k=1}^{\n} (histR[k]-prevHistR[k])^2/(histR[k])\$

O Codigo
link:MotionDetec//main.cpp[role=include]
Resultado

resultado

Filtragem no domínio espacial I

Laplace com gauss

Utilizando o programa exemplos/filtroespacial.cpp como referência, Implementar um programa laplgauss.cpp. O programa deverá acrescentar mais uma funcionalidade ao exemplo fornecido, permitindo que seja calculado o laplaciano do gaussiano das imagens capturadas.

O Codigo
link:Laplgauss//main.cpp[role=include]
Resultado utilizando filtro gaussiano

gauss

Resultado utilizando filtro laplaciano

laplace

Resultado utilizando filtro laplaciano do gaussiano

lagauss

foi verificado que ao utilizar o filtro gaussiano antes do laplaciano faz muito diferença pois o filtro gaussiano elimina pequenos ruidos que existem na imagem e o laplaciano consegue distinguir melhor as bordas

Filtragem no domínio espacial II

TiltShift

Utilizando o programa exemplos/addweighted.cpp como referência, implemente um programa tiltshift.cpp. Três ajustes deverão ser providos na tela da interface:

  • um ajuste para regular a altura da região central que entrará em foco

  • um ajuste para regular a força de decaimento da região borrada

  • um ajuste para regular a posição vertical do centro da região que entrará em foco. Finalizado o programa, a imagem produzida deverá ser salva em arquivo.

O Codigo
link:TiltShift//main.cpp[role=include]
Resultado

resultado

TiltShift com video

Utilizando o programa exemplos/addweighted.cpp como referência, implemente um programa tiltshiftvideo.cpp. Tal programa deverá ser capaz de processar um arquivo de vídeo, produzir o efeito de tilt-shift nos quadros presentes e escrever o resultado em outro arquivo de vídeo. A ideia é criar um efeito de miniaturização de cenas. Descarte quadros em uma taxa que julgar conveniente para evidenciar o efeito de stop motion, comum em vídeos desse tipo.

O Codigo
link:TiltShiftVideo//main.cpp[role=include]
Resultado

result3 1

Filtragem no domínio da frequência

Filtro Homomorfico

Problema: Utilizando o programa exemplos_dft.cpp como referência, Implementar o filtro homomórfico para melhorar imagens com iluminação irregular. Crie uma cena mal iluminada e ajuste os parâmetros do filtro homomórfico para corrigir a iluminação da melhor forma possível. Assuma que a imagem fornecida é em tons de cinza.

Teoria: Aplicar logaritimo na imagem para atuar separadamente nas componentes reflectancia e iluminação, pois a iluminação apresenta um perfil de baixas frequencias e a reflectancia altas frequencias, assim ao aplicar log na imagem e passar o filtro passa alta modificado teremos um efeito maior na componente de iluminação, assim foi feito o esquema a seguir:

diagrama

O Codigo
link:FiltroHomomorfico//main.cpp[role=include]
Filtro

filtro

Resultado 1 Comparação

juntas

Resultado 2

homo2

Resultado 3

homo3

Resultado 4

homo4

Canny

Canny e a arte com pontilhismo

Problema: Utilizando os programas exemplos/canny.cpp e exemplos/pontilhismo.cpp como referência, implemente um programa cannypoints.cpp. A idéia é usar as bordas produzidas pelo algoritmo de Canny para melhorar a qualidade da imagem pontilhista gerada. A forma como a informação de borda será usada é livre. Entretanto, são apresentadas algumas sugestões de técnicas que poderiam ser utilizadas:

  • Desenhar pontos grandes na imagem pontilhista básica.

  • Usar a posição dos pixels de borda encontrados pelo algoritmo de Canny para desenhar pontos nos respectivos locais na imagem gerada.

  • Experimente ir aumentando os limiares do algoritmo de Canny e, para cada novo par de limiares, desenhar círculos cada vez menores nas posições encontradas. A Figura Pontilhismo aplicado à imagem Lena foi desenvolvida usando essa técnica.

Metodo: Ao aplicar o filtro de canny em cada ponto da borda desenhar um circulo de raio menor

O Codigo
link:Pontilhismo//main.cpp[role=include]
Imagem original

abc

Imagem pontilhismo sem canny

Antes

Imagem canny

Canny

Imagem pontilhismo com canny

Depois

Bibliografia