Entendendo Iaconv

Autor:cronuxs
Data:07/05/2009

Exercicio

Objetivos:

Consolidar os exercícios feitos na semana passada e exercitar um pouco mais a convolução discreta.
  1. Escrever a equação que é de fato implementada pela rotina iaconv da toolbox ia636. Observe que o José Antonio implementou corretamente a equação da convolução iaconv que aparece na toolbox ia636.
  2. Baseado no roteiro de aula feito na última sexta-feira (ia636-2009:convolucao), elaborar uma lição sobre convolução digital para posteriormente ser agregado à toolbox ia636 na seção de Lessons. Pode ser em portugues mesmo ou preferencialmente em ingles. Se alguma solução ficar muito boa e for aprovada para ser incorporada à toolbox ia636, os créditos do aluno ficarão registrados no rodapé da página da contribuição.
  3. Utilize seu programa de convolução feito na lição anterior com filtros de dimensão 3x3 e 5x5. Utilize também, para efeitos de comparação, a função iaconv da toolbox ia636. Aplique estes filtros em dois casos: um filtro de suavização e um filtro de realce de detalhes. Escolha as máscaras de convolução apropriadas e a imagem para aplicar estes filtros.

Solução

Entrada:

  • Kernel
  • Matriz de entrada
  • Matriz de saida

Algoritmo:

Sendo:

  • o tamanho de F na direção x
  • o tamanho de F na direção y
  • o tamanho de H na direção x
  • o tamanho de H na direção y

No início:

  • é uma matriz com zeros, de tamanho
  • Após este momento é aplicado a seguinte formula:
  • Sendo i variando de 0 até e j variando de 0 até

Na realidade este algoritmo faz varios slices do g, soma com cada um dos itens de h multiplicado por f.

Como h, normalmente é pequeno e menor que f. A maior parte do trabalho será feito de forma matricial, pois o loop do fica sobre os indices do kernel (muito menos do que comparado aos indices da imagem de entrada)

Lição:

A convolução é um operador que, a partir de duas funções, produz uma terceira. O conceito de convolução está ligado ao de média móvel, e é crucial no estudo de sistemas lineares invariantes no tempo. (Wikipedia)

Definição:

Ela é definida como a integral do produto de uma das funções com uma cópia invertida, com relação a un determinado plano, da outra. A função resultante depende do valor deste deslocamento.

agora no caso bi-dimensional:

como a imagem é discreta, temos o caso discreto:

Exemplo:

Data a matriz de entrada:

[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]

Convoluida com a matriz :

[[1 2 3]
 [4 5 6]]

Temos a seguinte resposta:

[[ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  2.  3.  0.  0.]
 [ 0.  0.  4.  5.  6.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.]]

Note que o tamanho da imagem original almentou.

Comparação com iaconv

Suavização:

Kernel:

[[ 0.25  0.25]
 [ 0.25  0.25]]
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

<function iaconv at 0x3eaf500> Tempo: 0.00239396095276

<function convlinear2d at 0x3ee6140> Tempo: 0.00193810462952

Laplaciana:

Kernel:

[[ 0  1  0]
 [ 1 -4  1]
 [ 0  1  0]]
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

<function iaconv at 0x3eaf500> Tempo: 0.0205760002136

<function convlinear2d at 0x3ee6140> Tempo: 0.0184230804443

Sobel em X:

Kernel:

[[ 1  0 -1]
 [ 2  0 -2]
 [ 1  0 -1]]
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

<function iaconv at 0x3eaf500> Tempo: 0.00381898880005

<function convlinear2d at 0x3ee6140> Tempo: 0.00362586975098

Sobel em Y:

Kernel:

[[ 1  2  1]
 [ 0  0  0]
 [-1 -2 -1]]
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

<function iaconv at 0x3eaf500> Tempo: 0.00379800796509

<function convlinear2d at 0x3ee6140> Tempo: 0.0036780834198

Realce de detalhes

Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

<function iaconv at 0x3eaf500> Tempo: 0.00421190261841

<function convlinear2d at 0x3ee6140> Tempo: 0.0036289691925

imagem original