Convolução e Correlação

Este código faz a Correlação em uma imagem com uma máscara simples de pesos 1 e tamanho 3×3. É possível ver que a imagem resultante da convolução teve um leve “borramento”.

O tempo de execução do algoritmo para aplicar a máscara simples foi de 2.331 segundos. Com a imagem “percorrendo” a máscara, o tempo foi de 0.00454 segundos. Desta última forma, há maneiras implícitas de executar um for para percorrer algumas linhas e colunas da imagem, o que ajuda a tornar o processo muito mais rápido.

001# -*- coding: utf-8 -*-
002"""
003@author: Rafael Zottesso
004"""
005 
006# Apenas para contagem de tempo
007import timeit
008 
009# Outros imports necessários
010import numpy as np
011import cv2
012 
013# Cria uma função para fazer a correlação simples, movendo a máscara sobre a imagem
014def correlacao_comum(img, img_corr, mascara):
015 
016 # Percorre cada pixel da imagem
017 for x in range(img.shape[0]):
018 for y in range(img.shape[1]):
019 
020 # Usa o try porque algumas coordenadas não existem, assim não apresenta o erro. As bordas não estão sendo consideradas.
021 try:
022  
023 # Cálculo da máscara coluna a coluna: multuplica o peso que está na máscara pela intensidade do pixel
024 
025 ### Máscara simples, primeira coluna ##
026 m = img[x-1][y+1] * mascara[0][0]
027 m += img[x-1][y] * mascara[1][0]
028 m += img[x-1][y-1] * mascara[2][0]
029 
030 # Segunda coluna
031 m += img[x][y+1] * mascara[0][1]
032 m += img[x][y] * mascara[1][1]
033 m += img[x][y-1] * mascara[2][1]
034  
035 # Terceira coluna
036 m += img[x+1][y+1] * mascara[0][2]
037 m += img[x+1][y] * mascara[1][2]
038 m += img[x+1][y-1] * mascara[2][2]
039 
040 # Faz a média dos valores e guarda como intensidade do pixel
041 img_corr[x][y] = m/9
042 
043 # Quando a coordenada não existir, passe para o próximo pixel
044 except:
045 continue
046 
047 return img_corr
048 
049# Função com a imagem percorrendo a máscara (contrário da outra)
050def correlacao_rapida(img, img_corr, mascara):
051 
052 # criando uma nova imagem = tamanho da imagem + bordas da mascara
053 img_corr_rap = np.zeros(np.array(img.shape) + np.array(mascara.shape) - 1)
054 
055 # Percorre a máscara
056 for x in range(mascara.shape[0]):
057 for y in range(mascara.shape[1]):
058 
059 # Copia os valores para a imagem nova, que é maior para armazenar o cálculo
060 img_corr_rap[x:x+img.shape[0], y:y+img.shape[1]] += img * mascara[x,y]
061 
062 return img_corr_rap.astype('uint8')
063 
064# imread ( nome da imagem, [1=cor, 0=grayscape, -1=alpha])
065# Cada coluna da imagem é armazenada em um subvetor, onde cada coluna é uma posição
066img = cv2.imread('./Imagens/original.jpg', 0)
067 
068# Abre a imagem novamente para comparar com a original
069img_corr = cv2.imread('./Imagens/original.jpg', 0)
070 
071# Cria uma máscara simples com o mesmo peso
072mascara = np.array([ [1,1,1], [1,1,1], [1,1,1] ])
073 
074################### Comum ################
075# Verifica o horário inicial da convolução
076time_start = timeit.default_timer()
077 
078# Executa a função de correlação
079img_corr_comum = correlacao_comum(img, img_corr, mascara)
080 
081# Verifica o tempo final da convolução
082time_end = timeit.default_timer()
083 
084# Apresenta a duração do processo de convolução
085time = time_end - time_start
086print 'Tempo de processamento Comum:', time, 'segundos'
087 
088################ Rápida #######################
089 
090# Verifica o horário inicial da convolução
091time_start = timeit.default_timer()
092 
093# Executa a função de correlação
094img_corr_rapida = correlacao_rapida(img, img_corr, mascara)
095 
096# Verifica o tempo final da convolução
097time_end = timeit.default_timer()
098 
099# Apresenta a duração do processo de convolução
100time = time_end - time_start
101print 'Tempo de processamento Rápida:', time, 'segundos'
102 
103 
104# Mostrar imagem
105# nome da janela, matriz
106cv2.imshow('Original',img)
107 
108cv2.imshow('Correlação Másc. Simples',img_corr_comum)
109cv2.imwrite('./Imagens/original_corr.jpg', img_corr_comum)
110 
111# Funções para funcionamento correto ao mostrar a imagem numa janela
112cv2.waitKey(0)
113cv2.destroyAllWindows()

Imagens resultantes

# Imagem original

original

# Após a convolução com a máscara imples

original_conv

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *