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 |
007 | import timeit |
008 |
009 | # Outros imports necessários |
010 | import numpy as np |
011 | import cv2 |
012 |
013 | # Cria uma função para fazer a correlação simples, movendo a máscara sobre a imagem |
014 | def 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) |
050 | def 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 |
066 | img = cv2.imread( './Imagens/original.jpg' , 0 ) |
067 |
068 | # Abre a imagem novamente para comparar com a original |
069 | img_corr = cv2.imread( './Imagens/original.jpg' , 0 ) |
070 |
071 | # Cria uma máscara simples com o mesmo peso |
072 | mascara = np.array([ [ 1 , 1 , 1 ], [ 1 , 1 , 1 ], [ 1 , 1 , 1 ] ]) |
073 |
074 | ################### Comum ################ |
075 | # Verifica o horário inicial da convolução |
076 | time_start = timeit.default_timer() |
077 |
078 | # Executa a função de correlação |
079 | img_corr_comum = correlacao_comum(img, img_corr, mascara) |
080 |
081 | # Verifica o tempo final da convolução |
082 | time_end = timeit.default_timer() |
083 |
084 | # Apresenta a duração do processo de convolução |
085 | time = time_end - time_start |
086 | print 'Tempo de processamento Comum:' , time, 'segundos' |
087 |
088 | ################ Rápida ####################### |
089 |
090 | # Verifica o horário inicial da convolução |
091 | time_start = timeit.default_timer() |
092 |
093 | # Executa a função de correlação |
094 | img_corr_rapida = correlacao_rapida(img, img_corr, mascara) |
095 |
096 | # Verifica o tempo final da convolução |
097 | time_end = timeit.default_timer() |
098 |
099 | # Apresenta a duração do processo de convolução |
100 | time = time_end - time_start |
101 | print 'Tempo de processamento Rápida:' , time, 'segundos' |
102 |
103 |
104 | # Mostrar imagem |
105 | # nome da janela, matriz |
106 | cv2.imshow( 'Original' ,img) |
107 |
108 | cv2.imshow( 'Correlação Másc. Simples' ,img_corr_comum) |
109 | cv2.imwrite( './Imagens/original_corr.jpg' , img_corr_comum) |
110 |
111 | # Funções para funcionamento correto ao mostrar a imagem numa janela |
112 | cv2.waitKey( 0 ) |
113 | cv2.destroyAllWindows() |
Imagens resultantes
# Imagem original
# Após a convolução com a máscara imples